【问题标题】:Python3 Numpy array concatenation with stride? [duplicate]Python3 Numpy数组连接与步幅? [复制]
【发布时间】:2020-01-04 23:36:39
【问题描述】:

我有一些数组

x = np.empty(3)
y = np.empty(3)

for i in range(len(x)):
    x[i] = float(i)
    y[i] = float(i + 3)

print(x, y)

输出~[0., 1., 2.], [3., 4., 5.]

我希望能够得到这个

[0., 3., 1., 4., 2., 5.]

我该怎么做?

我尝试了zip,但这似乎创建了一个可迭代类,而不是传递给它的对象的新实例。

我尝试了np.concatenate(),但它似乎没有“步幅”选项,这与我可能正在寻找的内容一致。 (但是搜索不走运)

【问题讨论】:

  • @a_guest 是的,谢谢
  • 那么请标记为重复。

标签: python-3.x numpy


【解决方案1】:

您可以使用np.stack((x, y), axis=1).ravel()

【讨论】:

    【解决方案2】:

    无需迭代即可制作数组:

    In [157]: x = np.arange(3); y = np.arange(3, 6)                                 
    In [158]: x, y                                                                  
    Out[158]: (array([0, 1, 2]), array([3, 4, 5]))
    

    我们可以用

    将它们加入一个二维数组
    In [159]: np.array((x,y))         # np.vstack also works                                              
    Out[159]: 
    array([[0, 1, 2],
           [3, 4, 5]])
    

    然后我们可以ravel 或展平二维数组。通过指定fortran 顺序,我们得到你想要的交错:

    In [160]: np.array((x,y)).ravel(order='F')                                      
    Out[160]: array([0, 3, 1, 4, 2, 5])
    

    使用默认的 'c' 顺序:

    In [161]: np.array((x,y)).ravel()                                               
    Out[161]: array([0, 1, 2, 3, 4, 5])
    

    另一种方法是将它们堆叠为列:

    In [162]: np.stack((x,y),axis=1)                                                
    Out[162]: 
    array([[0, 3],
           [1, 4],
           [2, 5]])
    In [163]: np.stack((x,y),axis=1).ravel()                                        
    Out[163]: array([0, 3, 1, 4, 2, 5])
    

    从 zip 制作列表:

    In [164]: list(zip(x,y))                                                        
    Out[164]: [(0, 3), (1, 4), (2, 5)]
    

    这个列表是组;有一些方法可以使这样的列表变平。但我们也可以使用extend 将元组加入一个列表:

    In [165]: alist = []                                                            
    In [166]: for i,j in zip(x,y): alist.extend((i,j))                              
    In [167]: alist                                                                 
    Out[167]: [0, 3, 1, 4, 2, 5]
    

    vstackstackconcatenate 的变体,以不同的方式调整数组尺寸,然后在不同的轴上连接。

    In [169]: np.concatenate((x[:,None], y[:,None]),axis=1)                         
    Out[169]: 
    array([[0, 3],
           [1, 4],
           [2, 5]])
    

    另一种方式 - 加入行,并转置到列:

    In [170]: np.array((x,y)).T                                                     
    Out[170]: 
    array([[0, 3],
           [1, 4],
           [2, 5]])
    

    还有另一种方式 - 将数组插入到目标中,指定间隔:

    In [171]: res = np.zeros(6,int)                                                 
    In [172]: res[::2] = x; res[1::2] = y                                           
    In [173]: res                                                                   
    Out[173]: array([0, 3, 1, 4, 2, 5])
    

    【讨论】:

      【解决方案3】:

      使用zip

      np.ravel(list(zip(x,y)))
      

      输出:

      [0. 3. 1. 4. 2. 5.]
      

      您可以将zip 放入list 构造函数中解压,然后使用numpy.ravel 将其展平。

      【讨论】:

        猜你喜欢
        • 2011-12-13
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 2017-02-26
        相关资源
        最近更新 更多