Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Numpy:在2D布尔数组中按项目快速计算真实实例_Python_Arrays_Numpy - Fatal编程技术网

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

减法只是去掉了“当前”值。

很简单,这正是我想要的!谢谢:)