Мне нужно выполнить цикл, пока все элементы массива не станут равными 0

Вот мой код, он произвольно генерирует одно из четырех чисел (1,2,3,4) и поворачивает вправо влево или вверх и вниз, если рассматривать массив как доску, начальная точка - room [0] [0]. Он останавливается после изменения одного элемента массива на 0, но мне нужно это делать, пока все элементы не станут равными 0, спасибо!

import numpy
import random
N = 2
M = 2
time = 0
room = numpy.ones((N, M), dtype=int)
print(room)

i = 0
j = 0


while room.all() != 0:
    turn = random.choice([1, 2, 3, 4])
    if turn == 1 and i > 0:
        print("up")
        i = i - 1
        room[i][j] = 0
        time += 1
    elif turn == 2 and i < N - 1:
        print("down")
        i = i + 1
        room[i][j] = 0
        time += 1
    elif turn == 3 and j > M - 1:
        print("right")
        j = j + 1
        room[i][j] = 0
        time += 1
    elif turn == 4 and j < 0:
        print("left")
        j = j - 1
        room[i][j] = 0
        time += 1
    else:
       turn = random.choice([1, 2, 3, 4])
       print("hit the wall")

    print(room)
while np.sum(room) != 0:
T Burgis 31.10.2018 13:42

@TBurgis может ввести в заблуждение, если элементы массива отрицательные

nsaura 31.10.2018 13:43

Совершенно верно. Так же можно использовать any, предложенный ниже. -1 - это True в Python.

T Burgis 31.10.2018 13:47
0
3
870
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Метод all проверяет, все ли элементы вашего массива истинны (в данном случае не равны нулю), поэтому условие в цикле while становится False, как только в rooms имеется единственный ноль.

На самом деле вы хотите проверить, является ли элемент any в rooms правдивым (здесь он не равен нулю).

Вместо этого вы можете использовать while rooms.any(): ... (и опустить сравнение с != 0).

Спасибо @timgeb, проблема была решена с помощью функции any ()

Aegon 31.10.2018 13:53

Есть два пути решения проблемы:

Первый: Как предлагает @timgeb:

while room.any():

Второй: Чтобы использовать np.count_nonzero для проверки наличия ненулевого значения в массиве. Затем используйте это условие в цикле while.

while np.count_nonzero(room) > 0:  

ОДНАКО, когда я использую любое из этих условий, два элемента становятся 0, а два остаются 1, и я попадаю в бесконечный цикл. Это означает, что проблема где-то в вашей реализации ваших индексов.

При этом, зная два способа проверки ненулевых элементов, вам нужно проверить свой код на наличие ошибок реализации.

Отметим, что count_nonzero не поленился, в отличие от any.

timgeb 31.10.2018 13:50

@timgeb: Вы имеете в виду, что он будет медленнее, чем any?

Sheldore 31.10.2018 13:52

Я имею в виду, что any останавливается, как только находит ненулевой элемент. count_nonzero продолжает перебирать массив для подсчета всех ненулевых элементов. Поэтому я ожидаю, что для больших массивов он будет заметно медленнее.

timgeb 31.10.2018 13:53

@timgeb: Вы правы. Но это применимо только к одной итерации, верно? Так что, думаю, разница будет незначительной.

Sheldore 31.10.2018 13:54
count_nonzero вызывается каждый раз, когда проверяется условие while, это может быть более одной итерации. count_nonzero не ошибается, но я предпочитаю использовать ленивые операции, когда это возможно!
timgeb 31.10.2018 13:55

Вторые решения тоже пригодились, да и медленнее) спасибо, ребята

Aegon 31.10.2018 14:33

Другие вопросы по теме