我想根据一些索引更新np.array
。
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([1,2])
a[b, :][:, b] += 1
之后,a
保持不变,因为只修改了副本。
如何修改原始对象?
答案 0 :(得分:2)
使用numpy.ix_创建一个开放网格,并将其用于索引。使用ix_
利用广播,可以节省空间,因为它不需要创建索引的完整补充。
>>> import numpy as np
>>> np.ix_(b,b)
(array([[1],
[2]]), array([[1, 2]]))
>>>
>>> a[np.ix_(b,b)] += 10
>>> a
array([[ 0, 1, 2],
[ 3, 14, 15],
[ 6, 17, 18]])
>>>
对于此用例,最好使用ix_
,但也可以使用numpy.meshgrid。它的缺点是创建了一组更大的指数。
>>> np.meshgrid(b,b)
[array([[1, 2],
[1, 2]]), array([[1, 1],
[2, 2]])]
>>> a[np.meshgrid(b,b)] *= -1
>>> a
array([[ 0, 1, 2],
[ 3, -14, -15],
[ 6, -17, -18]])
>>>
Numpy的网格网格更常用于What is purpose of meshgrid in Python?和Meshgrids and disambiguating rows and columns from Cartesian coordinates
中的descibed答案 1 :(得分:0)
首先使用数组b
选择行并限制位置1的列以提取右下角的方块。
>>> a
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# select the square on the lower right corner and increment it
>>> a[b, 1:] += 1
>>> a
array([[ 1, 2, 3],
[ 4, 6, 7],
[ 7, 9, 10]])
或者,你也可以使用它:
>>> a[b, b[0]:] += 1
>>> a
array([[ 1, 2, 3],
[ 4, 6, 7],
[ 7, 9, 10]])
答案 2 :(得分:0)
您需要一步完成索引。对于您尝试做的事情,这将有效:
a[b[:, np.newaxis], b] += 1
print(a)
# array([[ 1, 2, 3],
# [ 4, 6, 7],
# [ 7, 9, 10]])
当您使用多个索引列表索引数组时,这些列表将broadcast一起索引到数组中。因此,如果您有2x1索引和1x2索引,则生成的数组切片为2x2,在这种情况下,引用您希望修改的数组的2x2部分。