17

numpy.ndarray複雑な整数値を保持するオブジェクトを作成したいと考えています。NumPy には複雑なサポートが組み込まれていますが、浮動小数点形式 (floatおよびdouble) のみです。たとえば、ndarraywithを作成できますが、類似の はありません。8 ビットまたは 16 ビットの整数を使用して表される複雑な値を保持する配列を作成できるようにしたいと考えています。dtype='cfloat'dtype='cint16'

誰かがそのようなサポートについて問い合わせた2007 年のこのメーリング リストの投稿を見つけました。dtype彼らが推奨した唯一の回避策は、整数のペアを保持する new を定義することでした。これは、各配列要素を 2 つの値のタプルとして表しているように見えますが、結果のデータ型を算術関数とシームレスに機能させるために他にどのような作業を行う必要があるかは明確ではありません。

また、NumPyへのユーザー定義型の登録に基づく別のアプローチも検討しました。C API を使用してこれをセットアップしても、問題なく動作する場合は問題ありません。ただし、型記述子構造体のドキュメントはkind、型のフィールドが符号付き/符号なし整数、浮動小数点、および複雑な浮動小数点数値型のみをサポートしていることを示唆しているようです。複雑な整数型を定義しようとしてどこにでも行けるかどうかは明らかではありません。

機能する可能性のあるアプローチに関する推奨事項はありますか?

編集:もう1つ。どのスキームを選択しても、コピーを実行せずに既存の複素整数バッファーをラップできる必要があります。つまり、PyArray_SimpleNewFromData()最初にバッファのコピーを作成することなく、バッファを Python に公開するために使用できるようにしたいと考えています。バッファーは既にインターリーブされた実数/虚数形式であり、int8_tまたはの配列のいずれかになりますint16_t

4

3 に答える 3

14

また、多くの複雑な整数データ (通常はベースバンド データ) も扱います。私が使う

dtype = np.dtype([('re', np.int16), ('im', np.int16)])

完全ではありませんが、データを適切に説明しています。データのサイズを2倍にせずにメモリにロードするために使用します。また、HDF5 で透過的にロードおよびストアできるという利点もあります。

DATATYPE  H5T_COMPOUND {
    H5T_STD_I16LE "re";
    H5T_STD_I16LE "im";
}

それを使用するのは簡単ですが、違います。

x = np.zeros((3,3),dtype)
x[0,0]['re'] = 1
x[0,0]['im'] = 2
x
>> array([[(1, 2), (0, 0), (0, 0)],
>>        [(0, 0), (0, 0), (0, 0)],
>>        [(0, 0), (0, 0), (0, 0)]], 
>>  dtype=[('re', '<i2'), ('im', '<i2')])

それを計算するために、ネイティブの複雑な float 型に変換します。明白なアプローチは機能しませんが、それほど難しくもありません。

y = x.astype(np.complex64) # doesn't work, only gets the real part
y = x['re'] + 1.j*x['im']  # works, but slow and big
y = x.view(np.int16).astype(np.float32).view(np.complex64)
y
>> array([[ 1.+2.j,  0.+0.j,  0.+0.j],
>>        [ 0.+0.j,  0.+0.j,  0.+0.j],
>>        [ 0.+0.j,  0.+0.j,  0.+0.j]], dtype=complex64)

https://stackoverflow.com/a/5658446/1784179に触発されたこの最後の変換アプローチ

于 2015-09-30T23:37:46.637 に答える
-1

Python、したがって Numpy は複素数をサポートしています。複素数が必要な場合は、np.round を使用するか、小数部分を無視してください。

例えば

import numpy as np
#Create 100 complex numbers in a 1D array
a=100*np.random.sample(100)+(100*np.random.sample(100)*1j)
#Reshape to a 2D array
np.round(a)
a.reshape(10,10)

#Get the real and imag parts of a couple x/y points as integers
print int(a[1:2].real)
print int(a[3:4].imag)
于 2013-02-07T13:49:27.470 に答える