我有一个包含True, False
元素的numpy数组A
。我想打印包含False
元素的所有索引。但是,我得到了一个错误。我给出了预期的输出:
import numpy as np
A=np.array([[False],
[False],
[ True],
[False],
[False]])
for i in range(0,len(A)):
if (A[i]==['False']):
print(i)
错误为:
FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
if (A[i]==['False']):
预期输出为:
[0,1,3,4]
7条答案
按热度按时间x9ybnkn61#
你可以使用argwhere一次性得到这些索引:
使用带有解包的np.where也可以工作:
csga3l582#
您也可以使用np.where:
注意:
np.squeeze
只删除了数组的最后一个维度。输出是预期的array([0, 1, 3, 4]
。8cdiaqws3#
.nonzero()将为您提供这些索引。
igetnqfo4#
您可以使用
np.arange
构建索引数组,然后使用布尔数组对索引进行切片,而不是对数组进行迭代。如果希望它具有与
A
相同的维数,则可以使用np.argwhere
0md85ypi5#
您正在将带有布尔值(即True/False)的列表与带有字符串值(即'False')的列表进行比较,因此您将得到错误。
按如下所示更改if条件(即,False不带引号):
如果(A[i] == [假])
dba5bblo6#
你也可以使用列表解析。
enumerate
被认为比range(len(A))
更像Pythonghhkc1vu7#
"你的代码有什么问题"
在循环的每次迭代中,你的数组都是
bool
类型的,而你正试图与list(str)
进行比较。为了使Numpy进行比较,它必须强制类型转换。但是Numpy只有在能够安全地强制数据类型转换的情况下才会执行比较(参见this answer)。尽管Python 3可以将bool('anything')
转换为True
,但Numpy并不认为这是安全的。为什么呢?我不知道,但看看这有多有趣:请注意,如果您执行以下操作,则会收到相同的警告:
np.array(['False']) == False
.对于元素级比较,可以使用
np.equal(array1, array2, dtype=your_type)
:如果是这样的话,它会抛出一个您可以处理的错误。
由于类型不能强制转换,因此无法执行比较。可以使用
np.can_cast
检查:已经有很多很棒的答案了,你可以随便选一个,你可能会觉得没问题,但如果你想保持类似的语法,这里是我的贡献:
在这里,
enumerate
将A
的每个元素与一个计数索引连接起来,并且每次element
为False
时,not element
都将返回True。但在最佳性能的情况下,总是喜欢使用Numpy的函数: