切片 numpy 数组不会修改原始数组



我遇到了与数组的这种交互,我有点困惑。我可以解决它,但为了我自己的理解,我想知道发生了什么。

从本质上讲,我有一个我正在尝试定制的数据文件,以便我可以将其作为我已经编写的一些代码的输入运行。这涉及对某些列、行等进行一些计算。特别是,我还需要重新排列一些元素,其中原始数组没有像我预期的那样被修改。

import numpy as np
ex_data = np.arange(12).reshape(4,3)
ex_data[2,0] = 0                #Constructing some fake data
ex_data[ex_data[:,0] == 0][:,1] = 3
print ex_data

基本上,我查看感兴趣的列,收集该列包含感兴趣的参数值的所有行,然后重新分配值。

使用上面的代码片段,我希望ex_data具有第 1 列元素,条件是如果它是第 0 列元素等于 0,则分配值为 3。然而,我所看到的是根本没有效果。

>>> ex_data
array([[ 0,  1,  2],
[ 3,  4,  5],
[ 0,  7,  8],
[ 9, 10, 11]])

在另一种情况下,如果我不"切片",我的"切片"数据文件,那么重新分配将照常进行。

ex_data[ex_data[:,0] == 0] = 3
print ex_data

在这里,我希望我的整行,条件为 0 列等于 0,填充 3。这就是你所看到的。

>>> ex_data
array([[ 3,  3,  3],
[ 3,  4,  5],
[ 3,  3,  3],
[ 9, 10, 11]])

谁能解释一下这种互动?

In [368]: ex_data
Out[368]: 
array([[ 0,  1,  2],
[ 3,  4,  5],
[ 0,  7,  8],
[ 9, 10, 11]])

第 0 列测试:

In [369]: ex_data[:,0]==0
Out[369]: array([ True, False,  True, False])

该布尔掩码可以应用于行,如下所示:

In [370]: ex_data[ex_data[:,0]==0,0]
Out[370]: array([0, 0])        # the 0's you expected
In [371]: ex_data[ex_data[:,0]==0,1]
Out[371]: array([1, 7])        # the col 1 values you want to replace
In [372]: ex_data[ex_data[:,0]==0,1] = 3
In [373]: ex_data
Out[373]: 
array([[ 0,  3,  2],
[ 3,  4,  5],
[ 0,  3,  8],
[ 9, 10, 11]])

您尝试的索引:

In [374]: ex_data[ex_data[:,0]==0]
Out[374]: 
array([[0, 3, 2],
[0, 3, 8]])

生成副本。 分配...[:,1]=3只会更改该副本,而不是原始数组。 幸运的是,在这种情况下,它很容易使用

ex_data[ex_data[:,0]==0,1]

而不是

ex_data[ex_data[:,0]==0][:,1]

最新更新