Python中numpy叉积产生的Rollaxis错误

2024-09-27 02:20:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试确定这个简单脚本的错误源数字阵列作为输入,并从数据集生成新的晶格

def reciprocalLat(lattice):
    for i,a in enumerate(lattice):
    print a
        b[i]=numpy.cross(a[(i+1)%3],a[(i+2)%3],axis=0)
#/numpy.dot(a[i],numpy.cross(a[(i+1)%3],a[(i+1)%3]),0)

当我尝试改变我的格子,甚至使用简单的例子和多种不同的方式

^{pr2}$

或者

print numpy.cross(lat[(1)%3],lat[(2)%3])

我刚得到这个错误

ValueError: rollaxis: axis (0) must be >=0 and < 0

rollaxis在这个问题中做了什么,它在这个问题的能力范围内做了什么,当我分配一个值时,我到底设置了什么。我如何修正这个错误(一个小于1且大于或等于1的东西怎么可能?)在

我的测试矩阵是:

[['4.7480001450' '-2.3740000725' '0.0000000000']
 ['0.0000000000' '4.1118887427' '0.0000000000']
 ['0.0000000000' '0.0000000000' '15.4790000916']]

Tags: 数据numpy脚本fordef错误数字晶格
1条回答
网友
1楼 · 发布于 2024-09-27 02:20:01

对于更新版本的np.cross(它使用rollaxis而不是swap),我可以通过以下方式生成此错误:

In [663]: np_cross.cross(lat[0,0],lat[0,1],axis=0)
                                     -
ValueError                                Traceback (most recent call last)
<ipython-input-663-ee756043fbb9> in <module>()
  > 1 np_cross.cross(lat[0,0],lat[0,1],axis=0)

/home/paul/mypy/np_cross.py in cross(a, b, axisa, axisb, axisc, axis)
     96     b = asarray(b)
     97     # Move working axis to the end of the shape
 -> 98     a = rollaxis(a, axisa, a.ndim)
     99     b = rollaxis(b, axisb, b.ndim)
    100     msg = ("incompatible dimensions for cross product\n"

/usr/lib/python3/dist-packages/numpy/core/numeric.py in rollaxis(a, axis, start)
   1340     msg = 'rollaxis: %s (%d) must be >=0 and < %d'
   1341     if not (0 <= axis < n):
-> 1342         raise ValueError(msg % ('axis', axis, n))
   1343     if not (0 <= start < n+1):
   1344         raise ValueError(msg % ('start', start, n+1))

ValueError: rollaxis: axis (0) must be >=0 and < 0

也就是说,当将标量(或0d)数组传递给cross时,会出现这个rollaxis错误。因此,请确保将向量传递给cross(即至少1d数组)。在

例如,latice是2d

^{pr2}$

那么a是1d,a[1]是标量。在


这是你的目标吗?在

In [675]: lat
Out[675]: 
array([[  4. ,  -2.3,   0. ],
       [  0. ,   4.1,   0. ],
       [  0. ,   0. ,  15. ]])

In [676]: np.vstack([np_cross.cross(lat[(i+1)%3],lat[(i+2)%3]) for i,a in enumerate(lat)])
Out[676]: 
array([[ 61.5,   0. ,   0. ],
       [ 34.5,  60. ,  -0. ],
       [ -0. ,   0. ,  16.4]])

我对你使用%3感到困惑,但从你的评论来看,你试图做b[0,:] = cross(lat[1,:], lat[2,:])等等

但是cross本身就是在做这种置换配对。来自旧的cross

        x = a[1]*b[2] - a[2]*b[1]
        y = a[2]*b[0] - a[0]*b[2]
        z = a[0]*b[1] - a[1]*b[0]

相关问题 更多 >

    热门问题