Присвоение сложных значений массивам 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]])