Python Numpy:在2D布尔数组中按项目快速计算真实实例
我有一个二维布尔数组,例如:Python Numpy:在2D布尔数组中按项目快速计算真实实例,python,arrays,numpy,Python,Arrays,Numpy,我有一个二维布尔数组,例如: [[False, True, True], [True, False, True], [True, False, False], [True, True, True]] 对于数组中的每一行,我想计算True的实例,并创建一个与原始数组形状相同的新的逐项数组,其中每个条目都是该行中以前所有True实例的总和。对于上面的示例,我希望的输出是: [[0, 0, 1], [0, 1, 1], [0, 1, 1], [0, 1, 2]] 有没有办法在Numpy中快速执行此
[[False, True, True],
[True, False, True],
[True, False, False],
[True, True, True]]
对于数组中的每一行,我想计算True的实例,并创建一个与原始数组形状相同的新的逐项数组,其中每个条目都是该行中以前所有True实例的总和。对于上面的示例,我希望的输出是:
[[0, 0, 1],
[0, 1, 1],
[0, 1, 1],
[0, 1, 2]]
有没有办法在Numpy中快速执行此操作,而不是像这样检查数组中的每个项目:
boolarr = np.array([[0, 1, 1], [1, 0, 1], [1, 0, 0], [1, 1, 1]], dtype=np.bool)
newarr = np.zeros(boolarr.shape)
for i, row in enumerate(boolarr):
for index, item in enumerate(row):
if item:
newarr[i][index+1:] += 1
我的阵列足够大(40 x 1260),速度是一个因素,因为这需要重复很多次
谢谢。基本上,您可以沿第二个轴使用,并在开始处使用“全零”列。因此,假设A
作为输入数组,您可以-
np.column_stack((np.zeros((A.shape[0],1),dtype=A.dtype),A[:,:-1].cumsum(1)))
一种更有效的方法是用全零初始化输出数组,然后将求和值插入其中,如下所示-
out = np.zeros(A.shape,dtype=int)
out[:,1:] = A[:,:-1].cumsum(1)
样本运行-
In [30]: A
Out[30]:
array([[False, True, True],
[ True, False, True],
[ True, False, False],
[ True, True, True]], dtype=bool)
In [31]: np.column_stack((np.zeros((A.shape[0]),dtype=A.dtype),A[:,:-1].cumsum(1)))
Out[31]:
array([[0, 0, 1],
[0, 1, 1],
[0, 1, 1],
[0, 1, 2]])
In [32]: out = np.zeros(A.shape,dtype=int)
...: out[:,1:] = A[:,:-1].cumsum(1)
...:
In [33]: out
Out[33]:
array([[0, 0, 1],
[0, 1, 1],
[0, 1, 1],
[0, 1, 2]])
cumsum
是你的朋友!它是累积和的缩写,您可以给它一个“轴”,在您的情况下,尝试运行:
np.cumsum(boolarr,axis=1) - boolarr
减法只是去掉了“当前”值。很简单,这正是我想要的!谢谢:)