作为输入,我有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.where
和np.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()
关于如何解决此错误或仅使用其他方法查找索引的任何建议?
答案 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])
您必须将==
测试包装在()中,使其首先发生,并且您必须使用&
执行逐元素的and
。 and
是标量运算,在布尔数组中不能很好地发挥作用。
行和列测试是:
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)))