按列表索引子数组

时间:2017-10-07 21:07:02

标签: numpy indexing

我有一些数组A和2个索引ind1ind2列表,每个轴一个。现在,这给了我一个数组,我需要为其分配一些新值。问题是,我的方法不起作用。

让我举一个例子。首先,我创建一个数组,并尝试访问一些切片:

>>> A=numpy.arange(9).reshape(3,3)
>>> ind1, ind2 = [0,1], [1,2]
>>> A
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> A[ind1,ind2]
array([1, 5])

现在这只给了我2个值,而不是我想要的2乘2矩阵。所以我尝试了这个:

>>> A[ind1,:][:,ind2]
array([[1, 2],
       [4, 5]])

好的,更好。现在让我们说这些值应为0:

>>> A[ind1,:][:,ind2]=0
>>> A
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

如果我尝试像这样分配,则数组A不会更新,因为双重索引(我只分配给A的某些副本,这将被丢弃)。有没有办法通过索引一次索引子数组?

注意:通过选择适当的范围(例如A[:2,1:3])进行索引可以适用于此示例,但我需要适用于任意索引列表的内容。

1 个答案:

答案 0 :(得分:1)

使用meshgrid创建二维索引怎么样?如下

>>> import numpy as np
>>> A = np.arange(9).reshape(3,3)
>>> ind1, ind2 = [0,1],[1,2]
>>> ind12 = np.meshgrid(ind1,ind2, indexing='ij')
>>> #     = np.ix_(ind1,ind2) as pointed out by @Divakar
>>> A[ind12]
[[1 2]
 [4 5]]

最后

>>> A[ind12] = 0
>>> A
[[0 0 0]
 [3 0 0]
 [6 7 8]]

适用于任意索引列表。

>>> ind1, ind2 = [0,2],[0,2]
>>> ind12 = np.meshgrid(ind1,ind2, indexing='ij')
>>> A[ind12] = 100
[[100   1 100]
 [  3   4   5]
 [100   7 100]]

正如@hpaulj在评论中指出的那样,请注意np.ix_ (ind1,ind2)实际上等同于np.meshgrid的使用,

>>> np.meshgrid(ind1,ind2, indexing='ij', sparse=True)

哪个先验更有效率。当参数np.ix_indexing分别设置为sparse'ij'时,这是True的优势。< / p>