我尝试索引某个矩阵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;
等
所有工作都按预期进行。似乎问题在于您使用某种列表进行索引。
答案 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]=v
为x.__setitem__((i,j),v)
。
x[i,j][k,l]=v
是x.__getitem__((i,j)).__setitem__((k,l),v)
。
set
适用于get
生成的值。如果get
返回视图,则更改会影响x
。但如果它产生副本,则更改不会影响x
。
使用数组m
,y[0:4,m]
会生成一个副本(我需要证明这个吗?)。 y[0:4,:]
生成一个视图。
因此,简而言之,如果第一个索引生成视图,则第二个索引分配有效。但是如果产生副本,第二个没有效果。