在Python中获取数组的索引

iq0todco  于 2023-02-26  发布在  Python
关注(0)|答案(7)|浏览(169)

我有一个包含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]
x9ybnkn6

x9ybnkn61#

你可以使用argwhere一次性得到这些索引:

indices = np.argwhere(A==False)[:,0]  # extract only row indexes from output

print(indices)
# [0 1 3 4]

使用带有解包的np.where也可以工作:

indices,_ = np.where(A==False)

print(indices)
# [0 1 3 4]
csga3l58

csga3l582#

您也可以使用np.where

A=np.array([[False],
            [False],
            [ True],
            [False],
            [False]])
print(np.where(np.squeeze(A)==False))

注意:np.squeeze只删除了数组的最后一个维度。输出是预期的array([0, 1, 3, 4]

8cdiaqws

8cdiaqws3#

.nonzero()将为您提供这些索引。

>>> A
array([[False],
       [False],
       [ True],
       [False],
       [False]])
>>> ~A
array([[ True],
       [ True],
       [False],
       [ True],
       [ True]])
>>>
>>> (~A).nonzero()[0]
array([0, 1, 3, 4])
>>>
>>>
>>> np.flatnonzero(~A)
array([0, 1, 3, 4])
igetnqfo

igetnqfo4#

您可以使用np.arange构建索引数组,然后使用布尔数组对索引进行切片,而不是对数组进行迭代。

np.arange(len(A))[~A.ravel()]
# returns:
array([0, 1, 3, 4])

如果希望它具有与A相同的维数,则可以使用np.argwhere

np.argwhere(~A.ravel())
# returns:
array([[0],
       [1],
       [3],
       [4]], dtype=int64)
0md85ypi

0md85ypi5#

您正在将带有布尔值(即True/False)的列表与带有字符串值(即'False')的列表进行比较,因此您将得到错误。
按如下所示更改if条件(即,False不带引号):
如果(A[i] == [假])

dba5bblo

dba5bblo6#

你也可以使用列表解析。
enumerate被认为比range(len(A))更像Python

[i for i,j in enumerate(A) if A[i]==[False]] 

#[0, 1, 3, 4]
ghhkc1vu

ghhkc1vu7#

"你的代码有什么问题"
在循环的每次迭代中,你的数组都是bool类型的,而你正试图与list(str)进行比较。为了使Numpy进行比较,它必须强制类型转换。但是Numpy只有在能够安全地强制数据类型转换的情况下才会执行比较(参见this answer)。尽管Python 3可以将bool('anything')转换为True,但Numpy并不认为这是安全的。为什么呢?我不知道,但看看这有多有趣:

>>> bool('False') == True
True
    • 如何使用两个不同的dtype数组进行元素比较?选择一个类型进行强制转换**

请注意,如果您执行以下操作,则会收到相同的警告:np.array(['False']) == False.
对于元素级比较,可以使用np.equal(array1, array2, dtype=your_type)

>>> compare = np.array(len(A)*(('False',),))
>>> compare
array([['False'],
       ['False'],
       ['False'],
       ['False'],
       ['False']], dtype='<U5')
>>> np.equal(A, compare, dtype=bool)
UFuncTypeError: Cannot cast ufunc 'equal' input 1 from dtype('<U5') to dtype('bool') with casting rule 'same_kind'

如果是这样的话,它会抛出一个您可以处理的错误。
由于类型不能强制转换,因此无法执行比较。可以使用np.can_cast检查:

>>> np.can_cast('<U5', bool)
False
    • 如何修复代码?**

已经有很多很棒的答案了,你可以随便选一个,你可能会觉得没问题,但如果你想保持类似的语法,这里是我的贡献:

for idx, element in enumerate(A):
    if not element:
        print(idx)

在这里,enumerateA的每个元素与一个计数索引连接起来,并且每次elementFalse时,not element都将返回True。
但在最佳性能的情况下,总是喜欢使用Numpy的函数:

>>> compare = np.array(len(A)*((False,),))
>>> np.where(np.equal(A, compare))[0]
array([0, 1, 3, 4])

相关问题