Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
等于或大于0时三个连续数的求和-Python_Python_Arrays_Function_Numpy - Fatal编程技术网

等于或大于0时三个连续数的求和-Python

等于或大于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 新数组比原始数组少两个元素,因为前两个数字的计算无法完成 谢谢!您可以,而且:

我正在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

新数组比原始数组少两个元素,因为前两个数字的计算无法完成

谢谢!

您可以,而且:

输出

[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参数,以避免损坏内存

  • 最后,将此数组视图与轴=1求和,以获得滚动和

  • 遮罩阵列和视景窗口(在引擎盖下使用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]