【问题标题】:NumPy Stack multidimensional arraysNumPy Stack 多维数组
【发布时间】:2020-10-02 01:30:12
【问题描述】:

我有3个nD数组如下

x = [[1, 2, 3],  
     [4, 5, 6],  
     [7, 8, 9]]    


y = [[10, 11, 12],
     [13, 14, 15],
     [16, 17, 18]]

z = [[ 19,  20,  21],
     [ 22,  23,  24],
     [ 25,  26,  27]]

不使用 for 循环,我试图将每个 2x2 矩阵元素附加在一起,这样

a1 = [[1,2]
      [4,5]]

a2 = [[10,11], 
      [13,14]]

a3 = [[19,20],
      [22,23]]

should append to

a = [[1,10,19],[2,11,20],[4,13,22],[5,14,23]]

Please note, the NxN matrix will always be N = j - 1 where j is x.shape(i,j)

Similarly for other 2x2 matrices, the arrays are as follows

b = [[2,11,20],[3,12,21],[5,14,23],[6,15,24]]
c = [[4,13,22],[5,14,23],[7,16,25],[8,17,26]]
d = [[5,14,23],[6,15,24],[8,17,26],[9,18,27]]

对于大型数据集,for 循环会影响运行时,所以我想看看是否有使用 NumPy 堆叠技术的方法

【问题讨论】:

  • 它没有回答我的问题。请重新打开它。我正在尝试从 3 个多维数组中提取 2x2 到 2d 数组中。我只有x,yz。如何创建所有可能的 2x2 矩阵。即 a1、a2、a3、b1、b2、b3,然后附加元素?
  • 认为这应该是您使用np.dstack 的起点。看起来你正在滑过。所以,也许在那里使用 sckit-image 的view_as_windows
  • 这里的NxN 是什么?对于较小的矩阵,它总是 2x2 还是 NxN

标签: python numpy matrix multidimensional-array


【解决方案1】:

你的 3 个数组:

In [46]: x=np.arange(1,10).reshape(3,3)                                                                         
In [48]: y=np.arange(10,19).reshape(3,3)                                                                        
In [49]: z=np.arange(19,28).reshape(3,3)                                                                        

合二为一:

In [50]: xyz=np.stack((x,y,z))                                                                                  
In [51]: xyz                                                                                                    
Out[51]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]],

       [[19, 20, 21],
        [22, 23, 24],
        [25, 26, 27]]])

你的a1 (2,2) 数组:

In [55]: xyz[0,:2,:2]                                                                                           
Out[55]: 
array([[1, 2],
       [4, 5]])

以及所有 3 个:

In [56]: xyz[:,:2,:2]                                                                                           
Out[56]: 
array([[[ 1,  2],
        [ 4,  5]],

       [[10, 11],
        [13, 14]],

       [[19, 20],
        [22, 23]]])

并将它们重新排列成所需的 (4,3):

In [57]: xyz[:,:2,:2].transpose(1,2,0)                                                                          
Out[57]: 
array([[[ 1, 10, 19],
        [ 2, 11, 20]],

       [[ 4, 13, 22],
        [ 5, 14, 23]]])
In [58]: xyz[:,:2,:2].transpose(1,2,0).reshape(4,3)                                                             
Out[58]: 
array([[ 1, 10, 19],
       [ 2, 11, 20],
       [ 4, 13, 22],
       [ 5, 14, 23]])

对于其他窗口类似:

In [59]: xyz[:,1:3,:2].transpose(1,2,0).reshape(4,3)                                                            
Out[59]: 
array([[ 4, 13, 22],
       [ 5, 14, 23],
       [ 7, 16, 25],
       [ 8, 17, 26]])
In [60]: xyz[:,0:2,1:3].transpose(1,2,0).reshape(4,3)                                                           
Out[60]: 
array([[ 2, 11, 20],
       [ 3, 12, 21],
       [ 5, 14, 23],
       [ 6, 15, 24]])
In [61]: xyz[:,1:3,1:3].transpose(1,2,0).reshape(4,3)                                                           
Out[61]: 
array([[ 5, 14, 23],
       [ 6, 15, 24],
       [ 8, 17, 26],
       [ 9, 18, 27]])

我们也可以像@Divakar 建议的那样使用view_as_windows(或as_strided),但从概念上讲这更棘手。

====

如果我stack 不同,我可以跳过转置:

In [65]: xyz=np.stack((x,y,z), axis=2)                                                                          
In [66]: xyz                                                                                                    
Out[66]: 
array([[[ 1, 10, 19],
        [ 2, 11, 20],
        [ 3, 12, 21]],

       [[ 4, 13, 22],
        [ 5, 14, 23],
        [ 6, 15, 24]],

       [[ 7, 16, 25],
        [ 8, 17, 26],
        [ 9, 18, 27]]])

In [68]: xyz[:2,:2].reshape(4,3)                                                                                
Out[68]: 
array([[ 1, 10, 19],
       [ 2, 11, 20],
       [ 4, 13, 22],
       [ 5, 14, 23]])

===

In [84]: import skimage                                                                                         
In [85]: skimage.util.view_as_windows(xyz,(2,2,3),1).shape                                                      
Out[85]: (2, 2, 1, 2, 2, 3)
In [86]: skimage.util.view_as_windows(xyz,(2,2,3),1).reshape(4,4,3)                                             
Out[86]: 
array([[[ 1, 10, 19],
        [ 2, 11, 20],
        [ 4, 13, 22],
        [ 5, 14, 23]],

       [[ 2, 11, 20],
        [ 3, 12, 21],
        [ 5, 14, 23],
        [ 6, 15, 24]],

       [[ 4, 13, 22],
        [ 5, 14, 23],
        [ 7, 16, 25],
        [ 8, 17, 26]],

       [[ 5, 14, 23],
        [ 6, 15, 24],
        [ 8, 17, 26],
        [ 9, 18, 27]]])

【讨论】:

    【解决方案2】:
    
    a1 = np.array([[1,2],[4,5]])
    
    a2 = np.array([[10,11],[13,14]])
    
    a3 = np.array([[19,20],[22,23]])
    
    def everything(a1,a2,a3):
    
        b1 = a1.reshape(-1)
        b2 = a2.reshape(-1)
        b3 = a3.reshape(-1)
        c = np.concatenate((b1, b2, b3))
        b = [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
        def inner(a, i):
            while i < len(a):
                i = i + 1
                return a[i - 1]
        def looping(a, c):
            k = 0
            j = 0
            while j < len(a) - 1:
                i = 0
                while i < len(a):
                    b[i][j] = inner(c, k)
                    i += 1
                    k += 1
                j += 1
        looping(b3, c)
        print(b)
    everything(a1,a2,a3)
    

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2011-11-16
    • 2016-01-28
    • 2021-11-23
    • 2017-12-18
    相关资源
    最近更新 更多