【问题标题】:Numpy advanced indexing failsNumpy 高级索引失败
【发布时间】:2018-10-31 14:44:11
【问题描述】:

我有一个如下所示的 numpy 数组:

 a = np.array([[0.87, 1.10, 2.01, 0.81 , 0.64,        0.        ],
   [0.87, 1.10, 2.01, 0.81 , 0.64,        0.        ],
   [0.87, 1.10, 2.01, 0.81 , 0.64,        0.        ],
   [0.87, 1.10, 2.01, 0.81 , 0.64,        0.        ],
   [0.87, 1.10, 2.01, 0.81 , 0.64,        0.        ],
   [0.87, 1.10, 2.01, 0.81 , 0.64,        0.        ]])

我喜欢通过将“左下”部分设置为零来进行操作。而不是循环遍历行和列,我想通过索引来实现这一点:

ix = np.array([[1, 1, 1, 1, 1, 1],
   [0, 1, 1, 1, 1, 1],
   [0, 0, 1, 1, 1, 1],
   [0, 0, 0, 1, 1, 1],
   [0, 0, 0, 0, 1, 1],
   [0, 0, 0, 0, 0, 1]])

但是a[ix] 并没有达到我的预期,因为a[ix].shape 现在是(6,6,6),即添加了一个新维度。我需要做什么才能保留a 的形状,但左下角全为零?

【问题讨论】:

    标签: python python-3.x numpy numpy-indexing


    【解决方案1】:

    如果你根本不想担心创建ix,你真正需要的是a的上三角,也就是numpy.triu的方法

    np.triu(a)
    

    array([[0.87, 1.1 , 2.01, 0.81, 0.64, 0.  ],
           [0.  , 1.1 , 2.01, 0.81, 0.64, 0.  ],
           [0.  , 0.  , 2.01, 0.81, 0.64, 0.  ],
           [0.  , 0.  , 0.  , 0.81, 0.64, 0.  ],
           [0.  , 0.  , 0.  , 0.  , 0.64, 0.  ],
           [0.  , 0.  , 0.  , 0.  , 0.  , 0.  ]])
    

    【讨论】:

      【解决方案2】:

      您不需要为此目的进行高级索引。 Boolean indexing 会更适合你所拥有的:

      a[~ix.astype(bool)] = 0
      a
      #array([[ 0.87,  1.1 ,  2.01,  0.81,  0.64,  0.  ],
      #       [ 0.  ,  1.1 ,  2.01,  0.81,  0.64,  0.  ],
      #       [ 0.  ,  0.  ,  2.01,  0.81,  0.64,  0.  ],
      #       [ 0.  ,  0.  ,  0.  ,  0.81,  0.64,  0.  ],
      #       [ 0.  ,  0.  ,  0.  ,  0.  ,  0.64,  0.  ],
      #       [ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ]])
      

      【讨论】:

        猜你喜欢
        • 2017-03-18
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        相关资源
        最近更新 更多