等于或大于0时三个连续数的求和-Python
我正在Python中使用numpy 我有一个数字数组,例如:等于或大于0时三个连续数的求和-Python,python,arrays,function,numpy,Python,Arrays,Function,Numpy,我正在Python中使用numpy 我有一个数字数组,例如: arr=np.array([0.1,1,1.2,0.5,-0.3,-0.2,0.1,0.5,1) 如果i是数组中的一个位置,我想创建一个函数,该函数创建i与前面两个数字的运行和,但仅当该数字等于或大于0时才累加该数字 换句话说,当计算三个数字的运行和时,数组中的负数等于0 例如,我在这里寻找的答案是 2.3,2.7,1.7,0.5,0.1,0.6,1.6 新数组比原始数组少两个元素,因为前两个数字的计算无法完成 谢谢!您可以,而且:
arr=np.array([0.1,1,1.2,0.5,-0.3,-0.2,0.1,0.5,1)
如果i
是数组中的一个位置,我想创建一个函数,该函数创建i
与前面两个数字的运行和,但仅当该数字等于或大于0时才累加该数字
换句话说,当计算三个数字的运行和时,数组中的负数等于0
例如,我在这里寻找的答案是
2.3,2.7,1.7,0.5,0.1,0.6,1.6
新数组比原始数组少两个元素,因为前两个数字的计算无法完成
谢谢!您可以,而且:
输出
[2.3 2.7 1.7 0.5 0.1 0.6 1.6]
最简单、最容易理解的方法。如果3个连续数字的索引为True
,则收集器将附加它们的总和,否则,它们都将变为0
s
该方法不是通用的,它适用于连续3次,但您可以对其进行调整
def sum_any(x,n):
collector = []
for i in range(len(arr)-(n-1)):
collector.append(sum(arr[i:i+n][arr[i:i+n]>0]))
return collector
您可以使用
np.correlate
在arr
的剪辑上扫描3个的数组,以获得所需的输出
In [20]: np.correlate(arr.clip(0), np.ones(3), mode='valid')
Out[20]: array([2.3, 2.7, 1.7, 0.5, 0.1, 0.6, 1.6])
正如Dani Mesejo所回答的,您可以使用跨步技巧。您可以使用剪辑或布尔索引来处理0->0.1->..
,直到一个7
)的形状,每次8字节来获取axis1中的元素(即0.1->1->1.2
,直到3
)
请谨慎使用此函数!始终使用x.strips来定义strips参数,以避免损坏内存
遮罩阵列和视景窗口(在引擎盖下使用numpy步幅)就是为此目的而构建的:
from skimage.util import view_as_windows
arr = view_as_windows(arr, 3)
arr2 = np.ma.masked_array(arr, arr<0).sum(-1)
巧妙的方法,没有想到这一点!很好的答案,我也为跨步技巧添加了更多的解释!关于跨步时的
的解释很好(
:)谢谢,这很有效。很高兴能帮上忙…上面的代码对立方体有效吗?我有一个时间维度,保留在里面会很有用。你是指更高维度的张量吗?是的。只要你不知道了解如何随着_-stride
的工作,您只需获得arr.strips
,这将是4D数组的4元素元组并运行上述代码。您必须定义预期的输出形状以及需要沿输出形状的这些轴采取的步幅。
In [20]: np.correlate(arr.clip(0), np.ones(3), mode='valid')
Out[20]: array([2.3, 2.7, 1.7, 0.5, 0.1, 0.6, 1.6])
arr = np.array([0.1, 1, 1.2, 0.5, -0.3, -0.2, 0.1, 0.5, 1])
w = 3 #rolling window
arr[arr<0]=0
shape = arr.shape[0]-w+1, w #Expected shape of view (7,3)
strides = arr.strides[0], arr.strides[0] #Strides (8,8) bytes
rolling = np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides)
rolling_sum = np.sum(rolling, axis=1)
rolling_sum
array([2.3, 2.7, 1.7, 0.5, 0.1, 0.6, 1.6])
from skimage.util import view_as_windows
arr = view_as_windows(arr, 3)
arr2 = np.ma.masked_array(arr, arr<0).sum(-1)
[2.3 2.7 1.7 0.5 0.1 0.6 1.6]