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数组中的累积和_Python_Arrays_Numpy_Cumsum - Fatal编程技术网

Python 带停止条件的numpy数组中的累积和

Python 带停止条件的numpy数组中的累积和,python,arrays,numpy,cumsum,Python,Arrays,Numpy,Cumsum,我想优化我的numpy代码,我使用大型阵列,所以效率是必需的。如果可能的话,我试着省略对looop的使用。 让我们假设一个简单的二维数组 1 3 5 2 0 1 5 6 2 我的任务是从列中选择此值,直到累计值达到某个值(如果需要,将值剪切到它)。让我们将此值命名为clip。所以在这次操作之后,我将得到如下数组: 1 3 3 2 0 0 0 0 0 我有一个相当幼稚的想法,用简单的变换来计算: array_clipped = np.clip(array, 0, clip) array_cl

我想优化我的numpy代码,我使用大型阵列,所以效率是必需的。如果可能的话,我试着省略对looop的使用。 让我们假设一个简单的二维数组

1 3 5
2 0 1
5 6 2
我的任务是从列中选择此值,直到累计值达到某个值(如果需要,将值剪切到它)。让我们将此值命名为clip。所以在这次操作之后,我将得到如下数组:

1 3 3
2 0 0
0 0 0 
我有一个相当幼稚的想法,用简单的变换来计算:

array_clipped = np.clip(array, 0, clip)
array_clipped_cumsum = np.cumsum(array_clipped, axis=0)
difference = clip - cumsum
difference_trimmed = np.where(difference<0, temp, 0)
final = array_clipped + difference_trimmed
final_clean = np.where(final>=0, final, 0)
array\u clipped=np.clip(数组,0,clip)
数组_clipped_cumsum=np.cumsum(数组_clipped,轴=0)
差异=剪辑-累积和
差异=np。其中(差异=0,最终,0)

这段代码运行时,看起来非常脏而且不干净。

更干净的方法是-

# a is input array and clip is the clipping value
c = a.cumsum(0)
out = (a-c+c.clip(max=clip)).clip(min=0)

这是另一个一行:

A = np.random.randint(0,10,(6,4))
A
# array([[0, 8, 7, 6],
#        [3, 2, 0, 4],
#        [5, 6, 6, 4],
#        [4, 5, 0, 3],
#        [7, 9, 6, 8],
#        [0, 9, 8, 3]])
cap = 15

np.diff(np.minimum(A.cumsum(0),cap),axis=0,prepend=0)
# array([[0, 8, 7, 6],
#        [3, 2, 0, 4],
#        [5, 5, 6, 4],
#        [4, 0, 0, 1],
#        [3, 0, 2, 0],
#        [0, 0, 0, 0]])
或者在两行中避免慢速的
前置

out = np.minimum(A.cumsum(0),cap)
out[1:] -= out[:-1]
out
# array([[0, 8, 7, 6],
#        [3, 2, 0, 4],
#        [5, 5, 6, 4],
#        [4, 0, 0, 1],
#        [3, 0, 2, 0],
#        [0, 0, 0, 0]])