【问题标题】:Comparing by section two numpy arrays in python比较python中的两个numpy数组
【发布时间】:2017-01-18 07:09:56
【问题描述】:

我想按部分对两个数组进行比较。 到目前为止,我必须得到所有数组的结果。

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

标签: python arrays python-2.7 numpy


【解决方案1】:

首先,让我们得到比较的掩码 -

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 的倍数,则会失败
  • 风格点:文档似乎倾向于将axis 传递为kwarg:.sum(axis=1)
  • @RiskaNanda 这意味着sum 沿着二维重构阵列的第二个轴。当我们跳过声明axis 参数时,相同的简写符号变为.sum(1)
【解决方案2】:

只需分别将每 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多