Numpy 高级索引失败

Numpy advanced indexing fails

我有一个像这样的 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.        ]])

我喜欢通过将 'bottom left' 部分设置为零来操纵它。我不想循环遍历行和列,而是想通过索引来实现:

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 的形状,但左下角全为零?

为此您不需要高级索引。 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.  ]])

如果您根本不想担心创建 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.  ]])