python numpy变异选择

时间:2016-07-18 12:02:49

标签: python arrays numpy selection

我在numpy中遇到了一个奇怪的错误(?): 给定一个嵌套数组:

p = np.asarray([[1., 2., 3.], [-4., -5., -6.], [1,2,-4]], dtype=np.float32)

array([[ 1.,  2.,  3.],
   [-4., -5., -6.],
   [ 1.,  2., -4.]], dtype=float32)

我想改变数组条件的第三个条目,如

p[p[:, 2] <0][:, 2] *= -1

然而,最后一句话并没有改变p。 我希望输出像

array([[ 1.,  2.,  3.],
   [-4., -5., 6.],
   [ 1.,  2., 4.]], dtype=float32)

但事实上它什么也没做。 p保持不变。 我测试了许多东西,但我没有得出结论为什么p不会发生变异。

当然,我可以以某种方式解决这个问题,但这对我来说似乎很奇怪。 欢呼并提前谢谢。 丹尼尔

3 个答案:

答案 0 :(得分:2)

颠倒方括号的顺序应修正它:

p[:, 2][p[:, 2] < 0] *= -1

布尔索引返回一个副本,除非你正在对它进行赋值,你可以通过使它成为最后一个索引操作来实现。

答案 1 :(得分:0)

您修改了原始数组的副本。如果你想改变原始数组,你应该使用这样的东西:

p[p[:, 2] <0, 2] *= -1

答案 2 :(得分:0)

p[boolean_array]会返回一份副本,因此您可以修改副本但保持原始状态不变。例如,您可以使用np.where代替。像p[:,2] = np.where(p[:,2], p[:,2], -p[:,2])

这样的东西