在python中修改子数组的值

时间:2018-12-06 13:08:31

标签: python numpy sub-array

我想在Python中修改子数组的值,但是它无法实现我想要的方式。这是一个示例,首先让我们考虑numpy数组:

A = np.reshape(np.arange(25),(5,5))

B = np.ones((2,3))

如果我们检查A的值,我们将得到:

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])

我想在A中替换子数组的值

A[:,[1,3,4]][[1,3],:]

按B的值。所以我在做以下事情:

A[:,[1,3,4]][[1,3],:] = B

我想得到:

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  1,  7,  1,  1],
       [10, 11, 12, 13, 14],
       [15,  1, 17,  1,  1],
       [20, 21, 22, 23, 24]])

但是,此方法不会更改A的值。当然,我可以使用循环逐个元素地执行此操作,但事实是我想使用16000 * 16000矩阵来执行此操作,因此我正在寻找一种不使用循环的方法。你能帮我吗?

任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:1)

这是一个令人困惑的案例。发生了什么事

A[:, [1,3,4]] 

索引到A,创建一个新数组,其中包含A的第1、3和4列。下一个表达式[[1, 3], :]索引该临时数组的行并设置其值。

要正常工作,您需要在同一表达式中索引列和行。但是,如果尝试这样做,则会引发错误

A[[1,3], [1,3,4]] = B  ## Not working!

正在发生的事情是numpy将列表解释为坐标对,这不是我们在这里想要的(有关详细信息,请参见https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html。要想从numpy中获得最大收益,这是必读的内容)。幸运的是,numpy为这种情况提供了ix_方法。它获取代表行和列的列表,并创建可用作索引的内容。

>>> A[np.ix_([1,3],[1,3,4])] = B

>>> A
array([[ 0,  1,  2,  3,  4],
       [ 5,  1,  7,  1,  1],
       [10, 11, 12, 13, 14],
       [15,  1, 17,  1,  1],
       [20, 21, 22, 23, -1]])