修改numpy

时间:2018-01-20 06:06:46

标签: python 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保持不变,因为只修改了副本。 如何修改原始对象?

3 个答案:

答案 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部分。