设置 numpy 数组的列值的奇怪结果
Weird result in setting column values of a numpy array
在下面的脚本中,我想将旋转矩阵应用于 (Nx3)
数组的前两列。
rotate_mat = lambda theta: np.array([[np.cos(theta),-np.sin(theta)],[np.sin(theta),np.cos(theta)]])
rot_mat = rotate_mat(np.deg2rad(90))
basis1 = np.array([[i+1,j+1,k+1] for k in range(3) for j in range(3) for i in range(3)])
basis2 = basis1.copy()
rot = basis2[:,0:2] @ rot_mat
print('rot','\n',rot[:3],'\n')
print('basis2','\n',basis2[:3],'\n')
basis2[:,0:2] = rot
print('basis2 after','\n',basis2[:3])
在我运行这个脚本之后,我得到了这个输出
rot
[[ 1. -1.]
[ 1. -2.]
[ 1. -3.]]
basis2
[[1 1 1]
[2 1 1]
[3 1 1]]
basis2 after
[[ 1 0 1]
[ 1 -2 1]
[ 1 -3 1]]
从basis2[:,0:2] = rot
可以看出,basis2
的第一行是[1,0,1]
,但是rot
的第一行显然是[1,-1]
,这个0
从哪里来的?
如果您查看 rot
的条目,您会发现 rot[0,1]
是 -0.9999999999999999
。此外basis2.dtype == dtype('int32')
。因此,在分配期间,新条目将转换为 int32
,将它们四舍五入为零。您可以验证
np.int32(rot[0, 1]) == 0
和
np.int32(rot[0, 1] - 1e-16) == -1
这是由于四舍五入造成的,如 np.cos(np.deg2rad(90)) == 6.123233995736766e-17
,而您可能希望它恰好为 0。
在下面的脚本中,我想将旋转矩阵应用于 (Nx3)
数组的前两列。
rotate_mat = lambda theta: np.array([[np.cos(theta),-np.sin(theta)],[np.sin(theta),np.cos(theta)]])
rot_mat = rotate_mat(np.deg2rad(90))
basis1 = np.array([[i+1,j+1,k+1] for k in range(3) for j in range(3) for i in range(3)])
basis2 = basis1.copy()
rot = basis2[:,0:2] @ rot_mat
print('rot','\n',rot[:3],'\n')
print('basis2','\n',basis2[:3],'\n')
basis2[:,0:2] = rot
print('basis2 after','\n',basis2[:3])
在我运行这个脚本之后,我得到了这个输出
rot
[[ 1. -1.]
[ 1. -2.]
[ 1. -3.]]
basis2
[[1 1 1]
[2 1 1]
[3 1 1]]
basis2 after
[[ 1 0 1]
[ 1 -2 1]
[ 1 -3 1]]
从basis2[:,0:2] = rot
可以看出,basis2
的第一行是[1,0,1]
,但是rot
的第一行显然是[1,-1]
,这个0
从哪里来的?
如果您查看 rot
的条目,您会发现 rot[0,1]
是 -0.9999999999999999
。此外basis2.dtype == dtype('int32')
。因此,在分配期间,新条目将转换为 int32
,将它们四舍五入为零。您可以验证
np.int32(rot[0, 1]) == 0
和
np.int32(rot[0, 1] - 1e-16) == -1
这是由于四舍五入造成的,如 np.cos(np.deg2rad(90)) == 6.123233995736766e-17
,而您可能希望它恰好为 0。