Python:比较一维数组和二维数组,询问两个数组在哪里都有非零项
考虑两个数组,Python:比较一维数组和二维数组,询问两个数组在哪里都有非零项,python,numpy,Python,Numpy,考虑两个数组,array1和array2,其中array1是1D,而array2是2D: array1 = [ 0 0 -80 -60 0 -30 ... ] array2 = [[-50 0 -20 0 -70 -80 ...], [ 0 0 0 -70 -40 0 ...], [ 0 -50 -30 -60 0 0 ...], ...
array1
和array2
,其中array1
是1D,而array2
是2D:
array1 = [ 0 0 -80 -60 0 -30 ... ]
array2 = [[-50 0 -20 0 -70 -80 ...],
[ 0 0 0 -70 -40 0 ...],
[ 0 -50 -30 -60 0 0 ...],
... ]
以下是我想要实现的目标:我想将array1
与array2
的每一行进行比较。每当array1
和array2
的相应行都有非零的条目时,我想增加一个计数器。最后,我想要一个数组,它的条目对应于每次比较的计数器值
以上面的数组为例:输出为:
[ 2, 1, 2 ]
我希望这是清楚的
现在,这里是棘手的部分:我不想使用任何for循环。我只想用numpy方法来实现这一点
我开始做这个,但我有点迷路了。然而,以下是我的一些想法:
indices1 = array1.nonzero()
indices2 = array2.nonzero()
equal_entries = np.where(np.equal(indices1, indices2))
假设array1
和array2
都是1D,这将返回一个numpy数组,其条目给出两个数组都具有非零元素的索引。这就是我想要的。几乎只是,我想要这个数组的长度。而且-由于array2
是2D-我希望array1
和array2
的每一行之间的每次比较都有这个长度。可能是,equal_entries=np。其中(np.equal(indices1,indices2))
工作正常,即使array2
是2D。因此,此行可能返回一个2D numpy数组,其中每一行都给出元素,其中array1
和array2
的相应行都有非零元素。不过我不确定。但即使是这样,我也只能在不使用for循环的情况下查找结果每行中的元素数
有什么想法吗 您可以使用
数组!=0
获取数组,如数组1的[False,False,True,True,False,True,…]
对两个数组都执行此操作,并使用&
仅在两个数组均为零的情况下获取True
然后取行和
np.sum((array1 != 0) & (array2 != 0), axis=1)
如果array1和array2使用行而不是array2的列进行比较是不直观的(例如,如果array2是二次的),则可以将array1显式地塑造为行向量:
np.sum((array1[np.newaxis, :] != 0) & (array2 != 0), axis=1)
一般说明:
- 如果您想让numpy计数,请生成一个布尔数组,并使用
对np.sum()
项进行计数李>True
- 如果要按行或列执行缩减操作(如求和),请使用
参数:为其指定要缩减的轴,因此如果要按行求和(轴0),则要沿所有列(轴1)缩减,请使用axis
np.sum(…,轴=1)
array1==0
更改为array1!=0,或者此逻辑比较(无论出于何种原因)仅适用于=
确定。我相应地改变了答案。