使用for循环在numpy数组中查找元素的索引

时间:2019-03-24 19:50:10

标签: python arrays python-3.x numpy

作为输入,我有2d numpy数组,让我们假设这个:

my_array = np.matrix([[3, 7, 0, 0],
                      [0, 2, 0, 0],
                      [0, 0, 0, 0],
                      [0, 0, 1, 0]])

我必须找到该数组中每个元素的索引,其中该行和该列中的元素之和==0。在这种情况下,答案为(2,3),因为第二行= 0,第三列的元素总和=0。到目前为止,我想到了这一点:

solution = [(i, j) for i in range(my_array.shape[0]) for j in range(my_array.shape[1]) if 1 not in my_array[i] and 1 not in my_array[:, j]]

问题是,我想在不使用for循环的情况下执行此操作。

我尝试使用np.wherenp.sum,最终得到了这个结果:

np.where(np.sum(my_array, axis=1) == 0 and np.sum(my_array, axis=0) == 0)

但我最终遇到此错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

关于如何解决此错误或仅使用其他方法查找索引的任何建议?

2 个答案:

答案 0 :(得分:2)

您的where表达式内部出现问题,试图将两个条件组合在一起:

In [210]: np.sum(arr, axis=1) == 0 and np.sum(arr, axis=0) == 0                 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-210-46c837435a31> in <module>
----> 1 np.sum(arr, axis=1) == 0 and np.sum(arr, axis=0) == 0

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [211]: (np.sum(arr, axis=1) == 0) & (np.sum(arr, axis=0) == 0)               
Out[211]: array([False, False, False, False])

您必须将==测试包装在()中,使其首先发生,并且您必须使用&执行逐元素的andand是标量运算,在布尔数组中不能很好地发挥作用。

行和列测试是:

In [212]: arr.sum(0)==0                                                         
Out[212]: array([False, False, False,  True])
In [213]: arr.sum(1)==0                                                         
Out[213]: array([False, False,  True, False])

但是您需要一种外部或笛卡尔组合,而不是简单的按元素组合(如果行和列的数量不同,这将更加明显)。

In [218]: (arr.sum(1)==0)[:,None] & (arr.sum(0)==0)                             
Out[218]: 
array([[False, False, False, False],
       [False, False, False, False],
       [False, False, False,  True],
       [False, False, False, False]])
In [219]: np.where(_)                                                           
Out[219]: (array([2]), array([3]))

或使用keepdims的{​​{1}}参数:

sum

答案 1 :(得分:0)

这里是使用itertools产品的解决方案。创建总和== 0的行和列的列表,并找到它们之间的组合。

from itertools import product

my_array = np.matrix([[3, 7, 0, 0],
                      [0, 2, 0, 0],
                      [0, 0, 0, 0],
                      [0, 0, 1, 0]])


a = np.argwhere(my_array.sum(axis = 1) == 0)[:,0]
b = np.argwhere(my_array.sum(axis = 0) == 0)[:,1]

np.array(list(product(a,b)))