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)
但是,根据我的实际数据(非常大),这太慢了。正确的做法是什么?
使用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)
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)