2015-05-17 2 views
1

Я пытался определить источник моей ошибки для этого простого скрипта, который принимает numpy.array в качестве входных данных и производит новую решетку из набора данныхошибка из поперечной Numpy произведения в 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) 

Когда Я стараюсь варьировать свою решетку или даже использовать урезанные примеры и множество различных способы

как

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

или

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

Я просто получаю эту ошибку

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

Что такое делать в поперечных этой проблеме и то, что он делает в качестве этой проблемы и что именно я садился, когда я присвоить значение. Как исправить эту ошибку (как-то может быть меньше 1 и больше или равно 1?)

Моя тестовая матрица была:

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

Какая бесчисленная версия? Кажется, это работает для меня с 1,9. – Jaime

+0

Я только что установил это сегодня, 1.9.2 для Python 2.7 – Skyler

+0

Это должно быть разрешено путем предоставления более явного сообщения об ошибке в 1.10 после того, как [этот PR] (https://github.com/numpy/numpy/pull/5886) получит слиты. – Jaime

ответ

2

С новой версией np.cross (который использует поперечный вместо свопа), я могу производить эту ошибку с:

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

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

затем 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] 
+0

OH, я получаю его сейчас – Skyler

+0

получил хорошие рекомендации о том, как я мог пересекать (математику) векторы a2 ​​и a3, чтобы сделать b1 (обобщенно, конечно), массив структурирован таким образом, что его состоят из a1, a2, a3 и его двойного вектор (math) b1 состоит из двух других векторов, деленных на тройное скалярное произведение (в комментариях) – Skyler