Numpy高级索引编制失败

时间:2018-10-31 14:44:12

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

我有一个如下的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的形状,但在左下角全为零,我该怎么做?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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.  ]])