设置索引索引数组时的Numpy数组值
我试图索引某个矩阵,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;
等
如预期的所有工作。看起来问题是当你用某种列表进行索引时。
制造阵列(这是我的最爱之一,因为值不同):
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]=v
是x.__getitem__((i,j)).__setitem__((k,l),v)
。
set
适用于由get
产生的值。如果get
返回一个视图,则更改会影响x
。但是,如果它生成副本,更改不会影响x
。
与数组m
,y[0:4,m]
产生副本(我需要证明这一点?)。 y[0:4,:]
产生一个视图。
因此,简而言之,如果第一个索引产生一个视图,第二个索引赋值就起作用。但是,如果产生副本,第二个没有效果。
这是有道理的,谢谢。在我的情况下,是否有可能在一个索引步骤中做我想做的事情? –
你可能会使用一些随机数而不是所有的'0.1',像'np.random.rand(5,4)'这样的输入,并显示我们预期的输出? – Divakar
我最初使用所有随机数进行测试,这是我最初遇到问题的地方。只是因为它具有更高的可重复性,我转而使用所有的“0.1”。 –
你可以在开始时使用'np.random.seed(1234)'来获得可重复的随机数。 – Divakar