11

我正在尝试使用同时分配交换 Numpy 数组的列,但出现意外行为:

A = arange(12).reshape(3,4)
print(A)

# prints [[ 0  1  2  3]    Ok
#         [ 4  5  6  7]
#         [ 8  9 10 11]]

A[:,0], A[:,1] = A[:,1], A[:,0]
print(A)

# prints [[ 1  1  2  3]    Not what intended (swap)
#         [ 5  5  6  7]
#         [ 9  9 10 11]]

预期行为:RHS 上数组的“视图”都被评估,然后由 LHS 上的目标对象执行分配,将 RHS 视图的内容“复制”到新位置。我声称副本是在切片到切片的分配中制作的,原因如下:

A = arange(12).reshape(3,4)
A[:,0] = A[:,1]
A[:,1] = array([99,99,99])
print A[:,0]

# prints: [1 5 9]

实际发生的情况:似乎在同时分配切片时,ndarray 会“一次一个”地评估并分配 RHS 和 LHS 上的各种术语: firstA[:,0] = A[:,1]和 then A[:,1] = A[:,0]

这是由于 ndarray 类以不同于标准 python 方式的方式自定义同时分配吗?

4

0 回答 0