3

次のコードは、配列の一部に数値を掛けます

def mul_by_num(a,b):
    a[0:2] *= b


import numpy as np
a = np.ones(5,dtype=np.float64)
mul_by_num(a,1.0)
mul_by_num(a,1j) #Generates a warning (and casts to float!)

2番目の呼び出しは警告を生成します

-c:2: ComplexWarning: Casting complex values to real discards the imaginary part

問題は、dtypesをいじることなく、numpy配列の一部を複素数/実数で乗算する最もPython的な方法は何ですか?配列を最初から複雑に変換したくはありませんが、プログラムは原則として複雑な入力を取得できます。

編集:

配列全体をコピーして、複雑にキャストすることは気にしません。ただし、dtypes(np.float32、np.float64、np.complex、np.intなど)のチェックは避けたいです。

4

2 に答える 2

5

ある時点で配列を複素数に変換する必要があります。そうしないと、複素数を保持できません。

配列を複素数に変換する最も簡単な方法は、次を追加すること0jです。

if (np.iscomplexobj(b)):
    a = a + 0j
a[0:2] *= b

注:配列をインプレースで変更しようとするわけ a += 0jではありません。配列がまだ複雑でない場合は機能しません。

于 2012-08-15T07:22:34.320 に答える
0

計算速度が向上するため、numpy 配列は同じ型であることを確認します。Pythonリストを試すか、キャストすることができます。

于 2012-08-15T07:31:28.030 に答える