修改由列表索引的多维numpy子阵列

时间:2013-04-02 04:24:11

标签: python arrays numpy indexing scipy

假设我有一个4x4 numpy数组:quad = arange(16).reshape(4,4),即

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

我希望用值更改元素

[[ 5  7]
 [ 9 11]]

到(例如),

[[16 17]
 [18 19]]

我最初的猜测是我可以做类似的事情,

quad[[1,3],[1,3]] = np.arange(16,20).reshape(2,2)

但这不起作用,因为quad[[1,3],[1,3]]实际上产生了对应于[5,11]的元素。我发现我可以使用quad[[1,3]][:,[1,3]] 查看相应的元素,但我无法使用它来修改这些值。

是使用for循环的唯一解决方案吗?

2 个答案:

答案 0 :(得分:4)

你可以这样做:

quad[np.ix_([1, 3], [1, 3])]

这是:

的简写
x = [[1, 1], [3, 3]]
y = [[1, 3], [1, 3]]
quad[x, y]

答案 1 :(得分:1)

这是Numpy中integer indexing的行为。如果给出N维数组A的索引作为N 1d数组大小为M的元组(m_1...m_n),那么切片构造为

result[m_1, ..., m_n] == np.array([A[m_1[0], ..., m_n[0]], A[m_1[1], ..., m_n[1]],
                           ..., A[m_1[M], ..., m_n[M]]]

要克服此行为,您可以使用切片索引两次:

>>> a = np.arange(16).reshape(4,4)
>>> a[1:3][:,1:3]
array([[ 5,  6],
       [ 9, 10]])

UPD:您可以修改此视图:

>>> b = np.arange(16,20).reshape(2,2)
>>> b
array([[16, 17],
       [18, 19]])
>>> a[1:3][:,1:3] = b
>>> a
array([[ 0,  1,  2,  3],
       [ 4, 16, 17,  7],
       [ 8, 18, 19, 11],
       [12, 13, 14, 15]])
相关问题