2016-11-13 149 views
0

我试图索引某个矩阵,y,然后用某个布尔语句重新索引该结果,并将y中的对应元素设置为0。下面显示了我用来测试这种索引方案的伪代码。设置索引索引数组时的Numpy数组值

x=np.zeros([5,4])+0.1; 
y=x; 
print(x) 
m=np.array([0,2,3]); 
y[0:4,m][y[0:4,m]<0.5]=0; 
print(y) 

我不确定为什么它不起作用。输出我想:

[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 
[[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0. 0.1 0. 0. ] 
[ 0.1 0.1 0.1 0.1]] 

但我实际上得到:

[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 
[[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1] 
[ 0.1 0.1 0.1 0.1]] 

我敢肯定,我错过了一些在引擎盖细节,解释了为什么这是行不通的。有趣的是,如果您将m替换为:,那么分配工作。出于某种原因,选择列的一个子集不会让我分配零。

如果有人可以解释发生了什么,并帮助我找到一种替代解决方案(希望这种解决方案不涉及生成临时numpy阵列,因为我的实际y将会非常巨大),我会非常感激!谢谢!

编辑: y[0:4,:][y[0:4,:]<0.5]=0; y[0:4,0:3][y[0:4,0:3]<0.5]=0;

如预期的所有工作。看起来问题是当你用某种列表进行索引时。

+0

你可能会使用一些随机数而不是所有的'0.1',像'np.random.rand(5,4)'这样的输入,并显示我们预期的输出? – Divakar

+0

我最初使用所有随机数进行测试,这是我最初遇到问题的地方。只是因为它具有更高的可重复性,我转而使用所有的“0.1”。 –

+0

你可以在开始时使用'np.random.seed(1234)'来获得可重复的随机数。 – Divakar

回答

0

制造阵列(这是我的最爱之一,因为值不同):

In [845]: x=np.arange(12).reshape(3,4) 
In [846]: x 
Out[846]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 
In [847]: m=np.array([0,2,3]) 
In [848]: x[:,m] 
Out[848]: 
array([[ 0, 2, 3], 
     [ 4, 6, 7], 
     [ 8, 10, 11]]) 
In [849]: x[:,m][:2,:]=0 
In [850]: x 
Out[850]: 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

没有变化。但是如果我一步完成索引,它就会改变。

In [853]: x[:2,:][:,m]=10 
In [854]: x 
Out[854]: 
array([[10, 1, 10, 10], 
     [10, 5, 10, 10], 
     [ 8, 9, 10, 11]]) 

x[i,j]x.__getitem__((i,j))执行:

In [851]: x[:2,m]=0 
In [852]: x 
Out[852]: 
array([[ 0, 1, 0, 0], 
     [ 0, 5, 0, 0], 
     [ 8, 9, 10, 11]]) 

如果我颠倒顺序它也适用。 x[i,j]=v as x.__setitem__((i,j),v)

x[i,j][k,l]=vx.__getitem__((i,j)).__setitem__((k,l),v)

set适用于由get产生的值。如果get返回一个视图,则更改会影响x。但是,如果它生成副本,更改不会影响x

与数组m,y[0:4,m]产生副本(我需要证明这一点?)。 y[0:4,:]产生一个视图。

因此,简而言之,如果第一个索引产生一个视图,第二个索引赋值就起作用。但是,如果产生副本,第二个没有效果。

+0

这是有道理的,谢谢。在我的情况下,是否有可能在一个索引步骤中做我想做的事情? –