我有一些数组A
和2个索引ind1
和ind2
列表,每个轴一个。现在,这给了我一个数组,我需要为其分配一些新值。问题是,我的方法不起作用。
让我举一个例子。首先,我创建一个数组,并尝试访问一些切片:
>>> 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]
)进行索引可以适用于此示例,但我需要适用于任意索引列表的内容。
答案 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>