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

时间:2018-08-24 03:22:20

标签: python arrays 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]])

有人可以解释互动吗?

1 个答案:

答案 0 :(得分:3)

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]