2015-03-16 1 views
0

У меня есть два массива, field_in_k_space_REAL и field_in_k_space_IMAGINARY, которые содержат, соответственно, действительные и мнимые части массива комплексных чисел, field_in_k_space_TOTAL, что Я хотел бы создать. Почему следующее присваивание не работает, производя ошибкуПрисваивание действительные и мнимые части комплексного массива из двух массивов, содержащих две части - Python

AttributeError: attribute 'real' of 'numpy.generic' objects is not writable 


field_in_k_space_TOTAL = zeros(n, complex) 
for i in range(n): 
    field_in_k_space_TOTAL[i].real = field_in_k_space_REAL[i] 
    field_in_k_space_TOTAL[i].imag = field_in_k_space_IMAGINARY[i] 
+1

сообщение об ошибке кажется довольно ясно; что тебя смущает? Вы читали, например. http://stackoverflow.com/q/2598734/3001761 – jonrsharpe

ответ

2

Вы не можете назначить конкретные реальные и мнимые части в Numpy элемента. Вы должны были бы создать промежуточное значение, а затем присвоить его field_total, например:

for i in range(n): 
    x = field_in_k_space_REAL[i] + field_in_k_space_IMAGINARY[i] 
    field_in_k_space_TOTAL[i] = x 

Это будет медленным и громоздким, хотя. Вместо этого, почему бы вам просто не добавить два массива вместе и использовать векторизацию? Я могу пообещать вам, это будет намного быстрее.

import numpy as np 

# Note: dropping the long names. 

field_real = np.array([0, 10, 20, 30]) 
field_imag = np.array([0j, 1j, 2j, 3j]) 

field_total = field_real + field_imag 

print(field_total) 
# [ 0.+0.j 10.+1.j 20.+2.j 30.+3.j] 

В случае, когда field_imag является массивом вещественных чисел, которые вы хотите преобразовать в воображаемый (как в исходном примере), то следующий код будет работать (спасибо jonrsharpe за комментарий).

field_real = np.array([0, 10, 20, 30]) 
field_imag = np.array([0, 1, 2, 3]) 

field_total = field_real + (field_imag * 1j) 
+5

Или если 'field_imag' еще не мнимый,' field_real + (field_imag * 1j) ' – jonrsharpe

1

Предложение от @Ffisegydd (и by @jonsharpe в комментарии) являются хорошими. Посмотрите, работает ли это для вас.

Здесь, я просто указать на то, что real и imag атрибуты массива являются записываемые и векторизация присваивание работает, так что вы можете упростить ваш код

field_in_k_space_TOTAL = zeros(n, complex) 

field_in_k_space_TOTAL.real = field_in_k_space_REAL 
field_in_k_space_TOTAL.imag = field_in_k_space_IMAGINARY 
0

Вы просто сделать

field_in_k_space_TOTAL = field_in_k_space_REAL + 1j*field_in_k_space_IMAGINARY 

Сложно сделать что-нибудь более простое. :)

0

При условии, что ваши типы данных совместимы, вы можете сделать:

field_in_k_space_TOTAL = np.hstack((field_in_k_space_REAL[:,None], field_in_k_space_IMAGINARY[:,None])).ravel().view(np.complex) 
Смежные вопросы