【问题标题】:Creating an overlap array with conditions - Python使用条件创建重叠数组 - Python
【发布时间】:2015-03-27 01:59:44
【问题描述】:

Data = [day(1) day(2)...day(N)...day(2N)..day(K-N)...day(K)]

我希望创建一个包含两个数组 N 和 K 的 numpy 数组,形状分别为 (120,) 和 (300,)。数组必须是以下形式:

x1 = [day(1) day(2) day (3)...day(N)] x2 = [day(2) day(3)...day(N) day(N+1)] xN = [day(N) day(N+1) day(N+2)...day(2N)] xK-N = [day(K-N) day(K-N+1)...day(K)]

X 基本上是 (K-N)xN 的形状,上面的 x1,x2,...xK-N 为行。我尝试使用iloc 来获得两个具有相同形状的数组NK。到那时还好。但是,当我尝试使用 X = np.array([np.concatenate((N[i:], K[:i] )) for i in range(len(N)]) 合并数组时,我得到的 NxN 数组只是重叠数组的形式,而不是所需的格式。

【问题讨论】:

    标签: python arrays python-3.x numpy


    【解决方案1】:

    这是您想要生成的(使用更简单的数据)吗?

    In [253]: N,K=10,15
    In [254]: data = np.arange(K)+10
    In [255]: data
    Out[255]: array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
    In [256]: np.array([data[np.arange(N)+i] for i in range(K-N+1)])
    Out[256]: 
    array([[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
           [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
           [12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
           [13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
           [14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
           [15, 16, 17, 18, 19, 20, 21, 22, 23, 24]])
    

    还有另一种生成方法,使用关于 strides 的高级想法:

    np.lib.stride_tricks.as_strided(data, shape=(K-N+1,N), strides=(4,4))
    

    在第一种情况下,新数组中的所有值都是原始数组的副本。跨步案例实际上是一个视图。所以对data 的任何更改都会出现在二维数组中。并且没有数据复制,2nd也更快。如果你有兴趣,我可以试着解释一下。


    Warren 建议使用hankel。这是一个简短的函数,在我们的例子中它基本上是:

    a, b = np.ogrid[0:K-N+1, 0:N]
    data[a+b]
    

    a+b 是一个数组,如:

    array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
           [ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
           [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
           [ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13],
           [ 5,  6,  7,  8,  9, 10, 11, 12, 13, 14]])
    

    在这个例子中,它只比列表理解解决方案好一点,但我希望它在更大的情况下会好很多。

    【讨论】:

    • 完美,伙计!这正是我想要的,你提供的第一个例子。谢谢。我也对 strides 的概念感兴趣,听起来很有趣。
    • 而不是strides=(4,4),使用strides=(data.stride[0],)*2 会更安全。即使你知道元素是整数,每个元素的大小也不一定是 4 个字节。在我的计算机上,整数数组中项目的默认大小是 8 个字节。 (在“生产代码”中,您应该在使用as_strided 之前仔细验证data 实际上是一个足够长度的一维数组。)
    • 关于步幅大小的要点。我添加了一个基于 hankel 所做的解决方案 - 这可能是最好的非跨步解决方案。
    【解决方案2】:

    可能不值得为以下添加对 scipy 的依赖,但如果您已经在代码中使用 scipy,则可以使用函数scipy.linalg.hankel

    In [75]: from scipy.linalg import hankel
    
    In [76]: K = 16
    
    In [77]: x = np.arange(K)
    
    In [78]: x
    Out[78]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15])
    
    In [79]: N = 8
    
    In [80]: hankel(x[:K-N+1], x[K-N:])
    Out[80]: 
    array([[ 0,  1,  2,  3,  4,  5,  6,  7],
           [ 1,  2,  3,  4,  5,  6,  7,  8],
           [ 2,  3,  4,  5,  6,  7,  8,  9],
           [ 3,  4,  5,  6,  7,  8,  9, 10],
           [ 4,  5,  6,  7,  8,  9, 10, 11],
           [ 5,  6,  7,  8,  9, 10, 11, 12],
           [ 6,  7,  8,  9, 10, 11, 12, 13],
           [ 7,  8,  9, 10, 11, 12, 13, 14],
           [ 8,  9, 10, 11, 12, 13, 14, 15]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-06-18
      相关资源
      最近更新 更多