我在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不会发生变异。
当然,我可以以某种方式解决这个问题,但这对我来说似乎很奇怪。 欢呼并提前谢谢。 丹尼尔
答案 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])