Присвоение сложных значений массивам numpy?
Это дает ожидаемый результат
x = random.rand(1) + random.rand(1)*1j
print x.dtype
print x, x.real, x.imag
и это работает
C = zeros((2,2),dtype=complex)
C[0,0] = 1+1j
print C
но если мы изменим его на
C[0,0] = 1+1j + x
Я получаю "TypeError: невозможно преобразовать комплекс в float".
Если мы теперь опустим явный dtype = complex
, я получаю "ValueError: установка элемента массива с последовательностью".
Может кто-нибудь объяснить, что происходит, и как это сделать без ошибок? Я потерян.
Ответы
Ответ 1
Чтобы вставить сложный x
или x + something
в C
, вам, видимо, нужно обработать его, как если бы он был массивом, поэтому либо индексируйте в x
, либо назначьте его фрагменту C
:
>>> C
array([[ 0.+0.j, 0.+0.j],
[ 0.+0.j, 0.+0.j]])
>>> C[0, 0:1] = x
>>> C
array([[ 0.47229555+0.7957525j, 0.00000000+0.j ],
[ 0.00000000+0.j , 0.00000000+0.j ]])
>>> C[1, 1] = x[0] + 1+1j
>>> C
array([[ 0.47229555+0.7957525j, 0.00000000+0.j ],
[ 0.00000000+0.j , 1.47229555+1.7957525j]])
Похоже, что NumPy неправильно обрабатывает этот случай. Попробуйте представить отчет об ошибке.
Ответ 2
На самом деле, ни одно из предлагаемых решений не работало в моем случае (Python 2.7.6, NumPy 1.8.2).
Но я обнаружил, что изменение dtype
от complex
(стандартная библиотека Python) до numpy.complex_
может помочь:
>>> import numpy as np
>>> x = 1 + 2 * 1j
>>> C = np.zeros((2,2),dtype=np.complex_)
>>> C
array([[ 0.+0.j, 0.+0.j],
[ 0.+0.j, 0.+0.j]])
>>> C[0,0] = 1+1j + x
>>> C
array([[ 2.+3.j, 0.+0.j],
[ 0.+0.j, 0.+0.j]])