2015-03-26 2 views
1

Это работает:Numpy комплекс массив умножения дает неподдерживаемый тип (ы) операнда

In [49]: type([1, 2, 3]) 
Out[49]: list 

In [50]: type(array([1, 2, 3])) 
Out[50]: numpy.ndarray 

In [52]: 1j*array([1, 2, 3]) 
Out[52]: array([ 0.+1.j, 0.+2.j, 0.+3.j]) 

Когда я пытаюсь сделать это на моем собственном списке asdf:

In [46]: type(asdf) 
Out[46]: list 

In [47]: type(array(asdf)) 
Out[47]: numpy.ndarray 

In [48]: 1j*array(asdf) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-48-dd0d8b4948e8> in <module>() 
----> 1 1j*array(asdf) 

TypeError: unsupported operand type(s) for *: 'complex' and 'numpy.ndarray' 

Умножение казался счастливым с короткий список, что может пойти не так для asdf? Он довольно большой, 20347 элементов, но это не имеет значения?

+3

Каков тип содержимого 'asdf'? Это сообщение об ошибке, которое вы получите для '1j * numpy.array (['string'])'. – user2357112

+2

'type (asdf [0]) -> str'. Спасибо. Почему сообщение об ошибке не говорит «complex» и «str», это было бы намного больше ... правильно. – Gauthier

ответ

2

Переводчик Python переводит * на звонок __mul__ (или один из его вариантов). А в случае 3 * obj он будет использовать метод obj.

Опираясь на свой комментарий, который asdf содержит строки:

In [205]: A=np.array(['A','B','C']) 
In [206]: B=np.array([1,2,3]) 
In [207]: B.__mul__(3) 
Out[207]: array([3, 6, 9]) 
In [208]: A.__mul__(3) 
Out[208]: NotImplemented 

Для массива строк метод возвращает «NotImplemented», не говоря ни слова о том, почему. Вероятно, именно поэтому сообщение об ошибке говорит numpy.array, тип A, а не dtype от A. Это сообщение об ошибке интерпретатора, а не numpy.


Существует версия multiply, которая работает со строками:

In [213]: np.char.multiply(A,3) 
Out[213]: 
array(['AAA', 'BBB', 'CCC'], 

Но не со сложными мультипликаторов.

Смежные вопросы