在 numpy 中修改索引对象



我想根据一些索引更新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]])

最新更新