3

さまざまな数値データ型を持つ NumPy 構造化配列があるとします。基本的な例として、

my_data = np.array( [(17, 182.1),  (19, 175.6)],  dtype='i2,f4')

これをフロートの通常の NumPy 配列にキャストするにはどうすればよいですか?

この回答から、私は使用できることを知っています

np.array(my_data.tolist())

しかし、「効率的にパックされたNumPy配列を通常のPythonリストに変換する」ため、明らかに遅いです。

4

4 に答える 4

3

パンダで簡単にできます:

>>> import pandas as pd
>>> pd.DataFrame(my_data).values
array([[  17.       ,  182.1000061],
       [  19.       ,  175.6000061]], dtype=float32)
于 2014-10-03T08:35:14.117 に答える
1

明らかな方法は次のとおりです。

>>> my_data
array([(17, 182.10000610351562), (19, 175.60000610351562)],
      dtype=[('f0', '<i2'), ('f1', '<f4')])
>>> n = len(my_data.dtype.names)  # n == 2
>>> my_data.astype(','.join(['f4']*n))
array([(17.0, 182.10000610351562), (19.0, 175.60000610351562)],
      dtype=[('f0', '<f4'), ('f1', '<f4')])
>>> my_data.astype(','.join(['f4']*n)).view('f4')
array([  17.       ,  182.1000061,   19.       ,  175.6000061], dtype=float32)
>>> my_data.astype(','.join(['f4']*n)).view('f4').reshape(-1, n)
array([[  17.       ,  182.1000061],
       [  19.       ,  175.6000061]], dtype=float32)
于 2014-10-03T13:54:22.257 に答える
0

ウォーレンの回答のバリエーション (フィールドごとにデータをコピーします):

x = np.empty((my_data.shape[0],len(my_data.dtype)),dtype='f4')
for i,n in enumerate(my_data.dtype.names):
    x[:,i]=my_data[n]

または、行ごとに繰り返すこともできます。 rタプルです。の行を満たすには、リストに変換する必要がありxます。多くの行と少数のフィールドでは、これは遅くなります。

for i,r in enumerate(my_data):
    x[i,:]=list(r)

を試してみるとx.data=r.data、エラーが発生する可能性があります: AttributeError: not enough data for arrayxdata は 4 つの float を持つバッファです。 my_dataそれぞれが int と float (または [int float int float] のシーケンス) を含む 2 つのタプルを持つバッファーです。 my_data.itemsize==6. いずれにせよ、my_dataをすべて float に変換し、タプルのグループ化を削除する必要があります。

しかしastype、ハイメが示すように使用するとうまくいきます:

x.data=my_data.astype('f4,f4').data

5 つのフィールドを持つ 1000 項目の配列を使用した簡単なテストでは、フィールドごとのコピーは を使用するのと同じくらい高速astypeです。

于 2014-10-03T16:56:50.917 に答える