假设我有一个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
循环的唯一解决方案吗?
答案 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]])