在Python中比较两个NumPy数组的部分

3

我想对这两个数组按部分进行比较,目前我只能得到所有数组的结果。

import numpy as np
array1 = np.array(list(np.zeros(20))+(list(np.ones(20)))+(list(2*np.ones(20))))
array2 = np.array(list(np.ones(20))+(list(np.ones(20)))+(list(3*np.ones(20))))
result = np.sum(array1 == array2)
print 'all result :' + str(result)

如何将数组中的数据分组统计,例如将第一组数据20、第二组数据20和第三组数据20分别统计出来?

结果应该是:

所有结果:20

第一组数据20的结果:0

第二组数据20的结果:20

第三组数据20的结果:0


np.array(list(np.zeros(20))+(list(np.ones(20)))+(list(2*np.ones(20)))) 更好的写法是 np.concatenate([np.zeros(20), np.ones(20), 2*np.ones(20)]) - Eric
2个回答

3
首先,让我们来了解比较掩码 -
mask = array1 == array2

然后,要获取所有总和-
allsum = mask.sum()

如果要按部分(长度为20)进行求和 -

section_sums = mask.reshape(-1,20).sum(1)

示例运行 -

In [77]: mask = array1 == array2

In [78]: mask.sum()
Out[78]: 20

In [79]: mask.reshape(-1,20).sum(1)
Out[79]: array([ 0, 20,  0])

对于普通长度

如果输入数组的长度不能保证是20的倍数,我们可以使用一种使用np.bincount获取section_sums的方法,代码如下 -

section_sums = np.bincount(np.arange(mask.size)//20,mask)

示例运行 -

In [5]: a1=np.array(list(np.zeros(20))+(list(np.ones(20)))+(list(2*np.ones(17))))
   ...: a2=np.array(list(np.ones(20))+(list(np.ones(20)))+(list(3*np.ones(17))))
   ...: 

In [6]: mask = a1==a2

In [7]: np.bincount(np.arange(mask.size)//20,mask)
Out[7]: array([  0.,  20.,   0.])

@OP:请注意,如果您的数组长度不是20的倍数,则此方法会失败。 - Eric
风格建议:文档似乎更喜欢将“axis”作为关键字参数传递:.sum(axis=1) - Eric
@RiskaNanda 这意味着在二维重塑数组的第二个轴上进行sum。相同操作的简写表示为.sum(1),因为我们省略了axis参数的声明。 - Divakar

1

将每20个分别求和:

matches = array1 == array2
print 'first  20: {}'.format(matches[:20].sum())
print 'second 20: {}'.format(matches[20:40].sum())
print 'third  20: {}'.format(matches[40:60].sum())

np.sum(x)通常等同于x.sum()

,其中涉及编程相关内容,保留了HTML格式,不做解释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接