【问题标题】:For loop in numpy 3d arraysnumpy 3d数组中的for循环
【发布时间】:2020-07-17 15:52:34
【问题描述】:

我想要一个像这样的基本 3d 数组:

b = np.arange(1,101).reshape(4,5,5)
b

那我想拿第一个索引,像楼梯一样往下走。

b1 = [b[0:,0,0],b[0:,1,1],b[0:,2,2],b[0:,3,3],b[0:,4,4]]
b1 = np.asarray(b1)
b1 = np.transpose(b1)
b1

上面的代码看起来不正确,我宁愿使用循环。 这是我目前所拥有的:

for i in range(0,5):
    b2 = b[0:,i,i]
    b2 = np.asarray(b2)
    b2 = b2.reshape(4,1)
    print(b2)

我对上述输出的问题是将每次迭代放入一个垂直数组,然后移至下一个。如何使上面的代码输出类似于我的第二个代码块?

对于格式不佳、stackoverflow 新手以及刚开始学习 code/numpy 的人表示歉意。

谢谢!

【问题讨论】:

    标签: python arrays numpy numpy-slicing


    【解决方案1】:

    你可以使用列表推导:

    b1 = [b[0:,i,i] for i in range(5)]
    b1 = np.asarray(b1)
    b1 = np.transpose(b1)
    

    【讨论】:

      【解决方案2】:

      您可以使用einsum一次提取所有楼梯:

      >>> np.einsum("ijj->ij",b) 
      array([[  1,   7,  13,  19,  25],
             [ 26,  32,  38,  44,  50],
             [ 51,  57,  63,  69,  75],
             [ 76,  82,  88,  94, 100]])
      

      然后拆分成列:

      >>> np.split(np.einsum("ijj->ij",b),np.arange(1,5),1)
      [array([[ 1],
             [26],
             [51],
             [76]]), array([[ 7],
             [32],
             [57],
             [82]]), array([[13],
             [38],
             [63],
             [88]]), array([[19],
             [44],
             [69],
             [94]]), array([[ 25],
             [ 50],
             [ 75],
             [100]])]
      

      【讨论】:

        【解决方案3】:

        我认为这就是你想要做的

        import numpy as np
        
        b = np.arange(1,101).reshape(4,5,5)
        
        result = np.diag(b[0])
        
        print(result)
        

        结果:

        [ 1  7 13 19 25]
        

        【讨论】:

          【解决方案4】:

          另一种方法(大概在你的楼梯上,b 的最后两个维度必须是方形):

          c = b[:,np.arange(b.shape[1]),np.arange(b.shape[2])]
          b2 = c.T.reshape(c.shape+(1,))
          

          输出:

          [[[  1]
            [ 26]
            [ 51]
            [ 76]
            [  7]]
          
           [[ 32]
            [ 57]
            [ 82]
            [ 13]
            [ 38]]
          
           [[ 63]
            [ 88]
            [ 19]
            [ 44]
            [ 69]]
          
           [[ 94]
            [ 25]
            [ 50]
            [ 75]
            [100]]]
          

          【讨论】:

            猜你喜欢
            • 2020-10-29
            • 2023-02-06
            • 2011-07-04
            • 1970-01-01
            • 2019-01-03
            • 1970-01-01
            • 1970-01-01
            • 2019-09-11
            相关资源
            最近更新 更多