我想根据一些索引更新np.array
。
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.array([1,2])
a[b, :][:, b] += 1
之后,a
保持不变,因为只修改了一个副本。如何修改原始对象?
创建一个带有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的meshgrid更常用于Python中meshgrid的目的是什么?和Meshgrids以及消除笛卡尔坐标中的行和列的歧义
一步完成索引。对于您要执行的操作,这将起作用:
a[b[:, np.newaxis], b] += 1
print(a)
# array([[ 1, 2, 3],
# [ 4, 6, 7],
# [ 7, 9, 10]])
使用多个索引列表为数组编制索引时,这些列表将一起广播以索引到数组中。因此,如果您有 2x1 索引和 1x2 索引,则生成的数组片是 2x2,在本例中引用您希望修改的数组的 2x2 部分。
首先使用数组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]])