0

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

4

2 回答 2

4

你可以做:

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

这是以下的简写:

x = [[1, 1], [3, 3]]
y = [[1, 3], [1, 3]]
quad[x, y]
于 2013-04-02T05:04:50.130 回答
1

这是Numpy中整数索引的一种行为。如果您将 N 维数组的索引作为 N 维数组A的索引,其中(m_1...m_n)包含大小为 M 的 N 个 1d 数组,则切片构造为

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]])
于 2013-04-02T05:00:13.763 回答