python numpy 变异选择

python numpy mutate 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 不发生变异的结论。

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

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

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

p[boolean_array] returns 一个副本,所以你修改了你的副本,但保持原件不变。例如,您可以使用 np.where 代替。类似于 p[:,2] = np.where(p[:,2], p[:,2], -p[:,2])

颠倒方括号的顺序应该可以解决问题:

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

布尔索引 returns 一个副本,除非您正在对其进行赋值,这可以通过将其作为最后一个索引操作来实现。