确定numpy数组的总和,同时排除某些值

The*_*ude 2 python arrays numpy sum

我想确定二维numpy数组的总和。但是,我要从此求和中排除具有特定值的元素。最有效的方法是什么?

例如,在这里我初始化一个numpy1的二维数组,并将其中几个替换为2:

import numpy

data_set = numpy.ones((10, 10))

data_set[4][4] = 2
data_set[5][5] = 2
data_set[6][6] = 2
Run Code Online (Sandbox Code Playgroud)

如何在排除所有2s的同时对二维数组中的元素求和?请注意,对于10 x 10数组,正确的答案应该是97,因为我将三个元素替换为值2。

我知道我可以使用嵌套的for循环来做到这一点。例如:

elements = []
for idx_x in range(data_set.shape[0]):
  for idx_y in range(data_set.shape[1]):
    if data_set[idx_x][idx_y] != 2:
      elements.append(data_set[idx_x][idx_y])

data_set_sum = numpy.sum(elements)
Run Code Online (Sandbox Code Playgroud)

但是,根据我的实际数据(非常大),这太慢了。正确的做法是什么?

Kor*_*rem 5

使用numpy的布尔数组索引功能。在下面的示例中,data_set!=2计算得出一个布尔数组,该数组True在元素不为2(且形状正确)的任何时候出现。因此,这data_set[data_set!=2]是一种获取不包含特定值的数组的快速便捷的方法。当然,布尔表达式可以更复杂。

In [1]: import numpy as np
In [2]: data_set = np.ones((10, 10))
In [4]: data_set[4,4] = 2
In [5]: data_set[5,5] = 2
In [6]: data_set[6,6] = 2
In [7]: data_set[data_set != 2].sum()
Out[7]: 97.0
In [8]: data_set != 2
Out[8]: 
array([[ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True],
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True],
       ...
       [ True,  True,  True,  True,  True,  True,  True,  True,  True,
         True]], dtype=bool)
Run Code Online (Sandbox Code Playgroud)


njz*_*zk2 5

Without numpy, the solution is not much more complex:

x = [1,2,3,4,5,6,7]
sum(y for y in x if y != 7)
# 21
Run Code Online (Sandbox Code Playgroud)

Works for a list of excluded values too:

# set is faster for resolving `in`
exl = set([1,2,3])
sum(y for y in x if y not in exl)
# 22
Run Code Online (Sandbox Code Playgroud)