У меня есть массив A. Я хочу идентифицировать все местоположения с элементом 1 и преобразовать его в список, как показано в ожидаемом результате. Но я получаю сообщение об ошибке.
import numpy as np
A=np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
B=np.where(A==1)
B=B.tolist()
print(B)
Ошибка
in <module>
B=B.tolist()
AttributeError: 'tuple' object has no attribute 'tolist'
Ожидаемый результат
[1, 2, 5, 7, 10, 11]
Добро пожаловать в Stack Overflow. Пожалуйста, подумайте хорошенько над логикой. «Я хочу идентифицировать все местоположения с элементом 1 и преобразовать его в список, как показано в ожидаемом результате». - что вы хотите "конвертировать"? Это не исходный массив A, а местоположения, которые вы получили от вызова .where - верно? Так. Является ли этот результат массивом? Что вместо этого?
Также прочтите ericlippert.com/2014/03/05/how-to-debug-small-programs и постарайтесь изучить проблемы, прежде чем спрашивать. Например, если вы получаете сообщение об ошибке из такого кода, как B=B.tolist(), то должно быть ясно, что существует проблема с попыткой использовать .tolist на B, поэтому следующим шагом в рассуждениях о проблеме должна быть проверка того, что такое B. . Когда вы это сделаете, вы обнаружите, что у вас обычный Python tuple, а не массив Numpy. Затем вы можете увидеть, что находится в этом кортеже: один элемент, представляющий собой массив, который вам нужен.
import numpy as np
A = np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
indices = np.where(A == 1)[0]
B = indices.tolist()
print(B)
Вы должны получить доступ к первому элементу этого кортежа с помощью B[0] :
import numpy as np
A=np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
B=np.where(A==1)
B = B[0].tolist()
print(B) # [1, 2, 5, 7, 10, 11]
Np.where используется только с условием, возвращает кортеж массивов, содержащих индексы; один массив для каждого измерения массива. Согласно документам, это очень похоже на np.nonzero, что является рекомендуемым подходом по сравнению с np.where. Итак, поскольку ваш массив одномерный, np.where вернет кортеж с одним элементом, внутри которого находится массив, содержащий индексы в ожидаемом результате. Вы можете решить свою проблему, обратившись к кортежу, например np.where(A == 1)[0].tolist().
Однако вместо этого я рекомендую использовать np.flatnonzero, что полностью избавляет от хлопот:
import numpy as np
A = np.array([0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
B = np.flatnonzero(A).tolist()
Б:
[1, 2, 5, 7, 10, 11]
PS: когда все остальные элементы равны 0, вам не нужно явно сравнивать с 1;).
Вы пробовали напечатать B перед тем, как вызвать tolist?