索引索引数组时设置Numpy数组的值

时间:2016-11-13 09:44:48

标签: arrays numpy indexing

我尝试索引某个矩阵y,然后使用一些布尔语句重新索引该结果,并将0中的相应元素设置为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

我确定我错过了一些引擎盖下的细节,这些细节解释了为什么这不起作用。有趣的是,如果您将:替换为y,则分配有效。出于某种原因,选择列的子集不允许我分配零。

如果有人能够解释发生了什么,并帮助我找到另一种解决方案(希望不会因为我的实际y[0:4,:][y[0:4,:]<0.5]=0;会产生一个临时的numpy数组,那么我会真的很大)欣赏它!谢谢!

编辑: y[0:4,0:3][y[0:4,0:3]<0.5]=0; OdbcCommand cm = new OdbcCommand("{CALL RET_IMPL_STS('?','?','?','?')}", cn); .... cm.Parameters["@P4"].Direction = ParameterDirection.InputOutput;

所有工作都按预期进行。似乎问题在于您使用某种列表进行索引。

1 个答案:

答案 0 :(得分: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 [851]: x[:2,m]=0
In [852]: x
Out[852]: 
array([[ 0,  1,  0,  0],
       [ 0,  5,  0,  0],
       [ 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))x[i,j]=vx.__setitem__((i,j),v)

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

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

使用数组my[0:4,m]会生成一个副本(我需要证明这个吗?)。 y[0:4,:]生成一个视图。

因此,简而言之,如果第一个索引生成视图,则第二个索引分配有效。但是如果产生副本,第二个没有效果。