Python为什么某些元素以数组和标量形式出现的原因

时间:2017-06-02 02:18:00

标签: python arrays numpy matrix

我正在运行一个基本上围绕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)

提前致谢

2 个答案:

答案 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数组,如果回到制作一个对象数组,还是会抛出错误?