我正在运行一个基本上围绕3维旋转大型数据阵列(50M线)的代码。然而,我遇到了一个奇怪的问题,我已经缩小到如何评估旋转矩阵。基本上,对于除x轴周围以外的任何旋转,python代码永远挂起(甚至可以从其中取出热键),即,当我尝试使用y / z对np.dot进行大型矩阵乘法时轮换和数据。
奇怪的是,当我使用x旋转并且计算得很好时,它绝对没问题。分别评估矩阵的形式,看起来在某些未知条件下,y和z旋转矩阵返回数组而不是标量,我怀疑这是干扰np.dot的numpy方法。
虽然我可以将旋转矩阵中的所有元素浮动并运行,但我想确定此问题的根源。我附上了一个改编自原始代码的示例代码,可以再现这种效果。第一组打印产生具有标量元素的旋转矩阵。第二组print语句产生矩阵,其中x_rotation具有标量元素,但y,z rotation对非零元素具有1x1数组
import numpy as np
def x_rot(a):
return np.array([[1,0,0],[0,np.cos(a),-np.sin(a)],[0,np.sin(a),np.cos(a)]])
def y_rot(a):
return np.array([[np.cos(a),0,-np.sin(a)],[0,1,0],[np.sin(a),0,np.cos(a)]])
def z_rot(a):
return np.array([[np.cos(a),-np.sin(a),0],[np.sin(a),np.cos(a),0],[0,0,1]])
ang1 = np.random.choice([-1.,1.],1)*((np.pi/4.*np.random.random()) + np.pi/6.)
print x_rot(0.1)
print y_rot(0.1)
print z_rot(0.1)
print y_rot(ang1)
print x_rot(ang1)
print z_rot(ang1)
提前致谢
答案 0 :(得分:2)
如果您想选择numpy.random.choice
的标量,请不要指定size
参数。指定size
为1会导致它生成长度为1的1维数组。
答案 1 :(得分:1)
当a
是标量时,所有3 rot
都会产生一个(3,3)数组。
当a
是random.choice生成的(1,)数组时,x_rot(a)
仍会生成(3,3),但其他生成(3,)对象数组< / p>
In [157]: a
Out[157]: array([-0.8658327])
In [158]: np.array([[np.cos(a),-np.sin(a),0],[np.sin(a),np.cos(a),0],[0,0,1]])
Out[158]:
array([[array([ 0.64800612]), array([ 0.76163512]), 0],
[array([-0.76163512]), array([ 0.64800612]), 0],
[0, 0, 1]], dtype=object)
In [159]: np.array([[np.cos(a),0,-np.sin(a)],[0,1,0],[np.sin(a),0,np.cos(a)]])
Out[159]:
array([[array([ 0.64800612]), 0, array([ 0.76163512])],
[0, 1, 0],
[array([-0.76163512]), 0, array([ 0.64800612])]], dtype=object)
仅评估我们获得的一行'
In [160]: np.array([np.cos(a),0,-np.sin(a)])
Out[160]: array([array([ 0.64800612]), 0, array([ 0.76163512])], dtype=object)
混合了np.cos(a)
和0
,'混淆'np.array
,然后又会产生一个对象数组。
rot_x
以[1,0,0]
开头,在某种意义上,它为阵列的其余部分设定了基调。这是np.array
如何处理具有混合维度的输入的复杂问题。它可以创建一个漂亮的2d数组,如果回到制作一个对象数组,还是会抛出错误?