【问题标题】:Iterating over matrixes in a list stopped in numpy迭代列表中的矩阵在 numpy 中停止
【发布时间】:2019-05-31 19:04:09
【问题描述】:

我想遍历一个矩阵矩阵(确实,听起来很奇怪),

import numpy as np

ar = np.array

A = ar([[[1,2,3],[4,5,6],[7,8,9]],[[11,12,13],[14,15,16],[17,18,19]], [[1,2,3],[4,5,6],[7,8,9]], [[20,21,22],[23,24,25],[26,27,28]]])

B = np.copy(A)
C = np.copy(A)

im = np.array([A,B,C])

为了接收在后续矩阵中存储 (x,y) 位置值的矩阵。例如,在[1,2,3]中,在1的位置上,表示:A[0,0,0],接下来的矩阵中只会出现1个。因此,我将在新矩阵中收到一个数组(同时考虑 A[0,0,1] 和 A[0,0,2]):

[[1  1  1] [2  2  2] [3  3  3]]

因此对于 A 的第一个数组:

[[[1  1  1] [2  2  2] [3  3  3]]
[[4  4  4] [5  5  5] [6  6  6]]
[[7  7  7] [8  8  8] [9  9  9]]]

我已经创建了这个函数:

def loop_ar(arr):
    matrix, v, c, s = arr.shape
    new = np.zeros((v,c,s,matrix)) #The columns in the last array of new represent the subsequent arrays
    for x in range(v):
        for y in range(c):
            for s in range(s):
                for ma in range(matrix):
                    new[x,y,s,ma] = arr[ma, x, y, s]
    return new

但是,输出表明,矩阵在几圈后停止迭代:

[[[[1. 1. 1.]
   [2. 2. 2.]
   [3. 3. 3.]]

  [[4. 4. 4.]
   [5. 5. 5.]
   [0. 0. 0.]]

  [[7. 7. 7.]
   [0. 0. 0.]
   [0. 0. 0.]]]


 [[[0. 0. 0.]
   [0. 0. 0.]
   [0. 0. 0.]]

  [[0. 0. 0.]
   [0. 0. 0.]
   [0. 0. 0.]]

  [[0. 0. 0.]
   [0. 0. 0.]
   [0. 0. 0.]]]

   ...

当我在列表列表上测试这个函数时,它起作用了。在这种情况下发生了什么?我该如何解决?这只是一个简单的案例来说明我的期望;但是,我想知道一个更复杂问题的解决方案,当 B 和 C 不是 A 的副本时。如何强制循环进行迭代?

在更复杂的情况下,B 和 C 应该与 A 具有相同的形状,但是它们在最后一个数组中会有所不同。和 A 一样,我们有:

[1  2  3]

例如,在 B 中,我们会在同一位置:

[23  34  56]

在 C 中:

[54  43  32]

因此新矩阵将包含数组:

[[1  23  54]  [2  34  43]  [3  56  32]]

我已经完成了将列表转换为数组的任务(我希望如此),因为 loop_arr 适用于列表。然而,这是一个轮回。我想要循环中断的解决方案和解释。

这里我为更复杂的问题提供随机数据:

A = ar([[[1,2,3],[4,5,6],[7,8,9]],[[11,12,13],[14,15,16],[17,18,19]],[[20,21,22],[23,24,25],[26,27,28]]])

B = ar([[[23,34,56], [56, 78, 90], [12, 34, 32]], [[74,75,65], [25,57,76], [90,24,35]]])

C = ar([[[13,31,53], [54,96,69], [78, 90, 99]], [[35,64,66], [13,35,53], [37,73,61]], [[62, 87,97], [80,35,62], [75,76,67]]]

新矩阵如下所示:

[[[[1  23  13]  [2  34  31]  [3  56  53]]
[[4  56  54]  [5  78  96] [6  90  69]]
[[7  12  78]  [8  34  90]  [9  32  99]]]
      ...so on, so on, so on...
                                     ]]]]

【问题讨论】:

  • a 来自哪里?
  • 用户:对不起,最后我决定大写字母会更突出,但似乎我省略了几个“as”。 @Onyambu,我会试试这个。但是,你能解释一下你的答案吗?
  • 您正在寻找np.kron(a,np.ones(3)).reshape(np.r_[a.shape,3]) 在这种情况下,您正在执行kronecker 乘法,这实际上是在重复矩阵
  • 谢谢,我检查了文档。我不得不承认这只是一个简单的案例,kron 不符合我对更复杂问题的期望。矩阵 B、C 不必是 A 的副本。然后我怎样才能包含它们的值或强制循环迭代?
  • @fgh 你到底想达到什么目的?这仅适用于矩阵 a,您可以对任意两个矩阵进行 kronecker 乘积,也可以进行矩阵乘法或绑定以获得所需的结果

标签: python-3.x loops numpy matrix


【解决方案1】:

numpy 已经被向量化了。你可以做一个克罗内克产品:

 np.kron(a,np.ones(3)).reshape(np.r_[a.shape,3])

array([[[[ 1.,  1.,  1.],
         [ 2.,  2.,  2.],
         [ 3.,  3.,  3.]],

        [[ 4.,  4.,  4.],
         [ 5.,  5.,  5.],
         [ 6.,  6.,  6.]],

        [[ 7.,  7.,  7.],
         [ 8.,  8.,  8.],
         [ 9.,  9.,  9.]]],


       [[[11., 11., 11.],
         [12., 12., 12.],
         [13., 13., 13.]],


        : : : : 
        : : : :

【讨论】:

    【解决方案2】:
    In [44]: A = np.array([[[1,2,3],[4,5,6],[7,8,9]],[[11,12,13],[14,15,16],[17,18,19]], 
        ...: [[1,2,3],[4,5,6],[7,8,9]], [[20,21,22],[23,24,25],[26,27,28]]]) 
        ...:                                                                         
    In [45]: A.shape                                                                     
    Out[45]: (4, 3, 3)
    In [46]: im = np.array([A,A+10,A+20])                                                
    In [47]: im.shape                                                                    
    Out[47]: (3, 4, 3, 3)
    

    在我看来,您的代码只是转置了轴,将matrix 维度放在最后而不是第一个。 np.stack 采用轴参数。或者,我们可以使用transpose 函数/方法:

    In [48]: im1 = np.stack([A,A+10,A+20], axis=3)                                       
    In [49]: im1.shape                                                                   
    Out[49]: (4, 3, 3, 3)
    In [50]: im2 = im.transpose(1,2,3,0)                                                 
    In [51]: im2.shape                                                                   
    Out[51]: (4, 3, 3, 3)
    In [52]: im2                                                                         
    Out[52]: 
    array([[[[ 1, 11, 21],
             [ 2, 12, 22],
             [ 3, 13, 23]],
    
            [[ 4, 14, 24],
             [ 5, 15, 25],
             [ 6, 16, 26]],
    
            [[ 7, 17, 27],
             [ 8, 18, 28],
             [ 9, 19, 29]]],
    
            ....
            [[26, 36, 46],
             [27, 37, 47],
             [28, 38, 48]]]])
    In [53]: np.allclose(im1,im2)                                                        
    Out[53]: True
    

    我无法测试更复杂的情况,因为B 的形状错误。并且C 有错误的终止字符。

    ===

    要查看您的迭代有什么问题,请在循环开始时打印s。看看它是如何演变的。然后将迭代变量更改为k,然后观察。

    【讨论】:

    • 太好了!换s解决了问题,谢谢。
    • 问题出在 s 上,我省略了 s - 这是我在 for 循环中的典型变化元素,例如 x 或 y。我不是指具体的计算,而是关注索引、位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多