gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:06:11 25 4
gpt4 key购买 nike

作为输入,我有 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()

关于如何修复此错误或仅使用其他方法来查找索引有什么建议吗?

最佳答案

在尝试组合两个条件时,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 是标量运算,不能很好地与 bool 数组配合使用。

行和列测试是:

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]))

或者使用 sumkeepdims 参数:

In [220]: arr.sum(0, keepdims=True)==0                                          
Out[220]: array([[False, False, False, True]])
In [221]: arr.sum(1, keepdims=True)==0
Out[221]:
array([[False],
[False],
[ True],
[False]])
In [222]: np.where(_220 & _221) # Out[220] etc
Out[222]: (array([2]), array([3]))

关于python - 不使用for循环查找numpy数组中元素的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55327903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com