我遇到了与数组的这种交互,我有点困惑。我可以解决它,但是据我自己的理解,我想知道发生了什么。
从本质上讲,我有一个要尝试定制的数据文件,因此我可以将其作为已编写的某些代码的输入来运行。这涉及到对某些列,行等的一些计算。特别是,我还需要重新排列一些元素,在这些元素中,原始数组未按我期望的那样进行修改。
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]])
有人可以解释互动吗?
答案 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]