【问题标题】:Numpy operation to expand array into sequential slices of given length?将数组扩展为给定长度的连续切片的 Numpy 操作?
【发布时间】:2020-04-03 00:56:15
【问题描述】:

my_function 必须将 1D numpy 数组扩展为 2D numpy 数组,第二个轴包含 length 的切片,从第一个索引开始直到结束。示例:

import numpy as np
a = np.arange(10)
print (my_function(a, length=3))

预期输出

array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6],
       [5, 6, 7],
       [6, 7, 8],
       [7, 8, 9]])

我可以使用 for 循环来实现这一点,但我想知道是否有为此的 numpy 矢量化技术。

def my_function(a, length):
    b = np.zeros((len(a)-(length-1), length))
    for i in range(len(b)):
        b[i] = a[i:i+length]
    return b

【问题讨论】:

    标签: python arrays numpy vectorization array-broadcasting


    【解决方案1】:

    如果您注意数学并注意文档中的警告,您可以使用np.lib.stride_tricks.as_strided()。您需要为数组计算正确的尺寸,以免溢出。另请注意,as_strided() 共享内存,因此您将在最终输出中多次引用同一内存。 (当然,您可以将其复制到新数组中)。

    >> import numpy as np
    
    >> def my_function(a, length):
        stride = a.strides[0]
        l = len(a) - length + 1
        return np.lib.stride_tricks.as_strided(a, (l, length), (stride,stride) )
    
    >> np.array(my_function(np.arange(10), 3))
    
    array([[0, 1, 2],
           [1, 2, 3],
           [2, 3, 4],
           [3, 4, 5],
           [4, 5, 6],
           [5, 6, 7],
           [6, 7, 8],
           [7, 8, 9]])
    
    >> np.array(my_function(np.arange(15), 7))
    
    array([[ 0,  1,  2,  3,  4,  5,  6],
           [ 1,  2,  3,  4,  5,  6,  7],
           [ 2,  3,  4,  5,  6,  7,  8],
           [ 3,  4,  5,  6,  7,  8,  9],
           [ 4,  5,  6,  7,  8,  9, 10],
           [ 5,  6,  7,  8,  9, 10, 11],
           [ 6,  7,  8,  9, 10, 11, 12],
           [ 7,  8,  9, 10, 11, 12, 13],
           [ 8,  9, 10, 11, 12, 13, 14]])
    

    【讨论】:

    • 好主意,也是最快的解决方案。谢谢
    【解决方案2】:

    这个功能怎么样?

    import numpy as np
    def my_function(a, length):
        result = []
        for i in range(length):
            result.append(a + i)
        return np.vstack(result).T[:len(a) - length + 1]
    
    a = np.arange(10)
    length = 3
    my_function(a, length)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2015-06-06
      • 2014-02-13
      • 2017-08-09
      相关资源
      最近更新 更多