In the script below, I want to apply a rotation matrix to the first two columns of a (Nx3)
array.
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])
after I ran this script, I obtained this output
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]]
as you can see by basis2[:,0:2] = rot
, the first row of basis2
is [1,0,1]
, however, the first row of rot
is clearly [1,-1]
, where does this 0
come from?
If you take a look at the entries of
rot
you will see thatrot[0,1]
is-0.9999999999999999
. Furthermorebasis2.dtype == dtype('int32')
. So during the assignment the new entries get converted toint32
which rounds them towards zero. You can verify thatand
This is due to rounding, as
np.cos(np.deg2rad(90)) == 6.123233995736766e-17
, when you'd probably expect it to be exactly 0.