numpy で構造化配列を使用していくつかの作業を行っています (最終的には pandas データフレームに変換します)。
ここで、いくつかのデータを読み取り (実際には一部のデータをメマッピングします)、ユーザー指定の制約でフィルター処理することにより、この構造化配列を生成します。次に、このデータを、読み取った形式 (読み取り元のファイルのスペースを節約するためにすべてが int である) から、より使いやすい形式に変換して、いくつかの単位変換を行うことができるようにします (つまり、にアップコンバートします)。フロート)。
構造化されたデータ型を変更する途中で、興味深い成果物 (または何か) に気付きました。データを読み取ると、次によって作成されるのと同じ構造化配列が得られるとします (実際のコードでは、dtype ははるかに長く複雑ですが、mwe にはこれで十分です)。
import numpy as np
names = ['foo', 'bar']
formats = ['i4', 'i4']
dtype = np.dtype({'names': names, 'formats': formats})
data = np.array([(1, 2), (3, 4)], dtype=dtype)
print(data)
print(data.dtype)
これにより、
[(1, 2) (3, 4)]
[('foo', '<i4'), ('bar', '<i4')]
構造化配列として
ここで、2 番目のコンポーネントの名前を変更しながら、これらの dtype の両方を double にアップコンバートしたいとします。それは簡単なはずです
names[1] = 'baz'
formats[0] = np.float
formats[1] = np.float
dtype_new = np.dtype({'names': names, 'formats': formats})
data2 = data.copy().astype(dtype_new)
print(data2)
print(data2.dtype)
しかし結果は予想外
(1.0, 0.0) (3.0, 0.0)]
[('foo', '<f8'), ('baz', '<f8')]
2 番目のコンポーネントのデータはどうなりましたか? この変換を行うことができますが、物事を分割すると
dtype_new3 = np.dtype({'names': names, 'formats': formats})
data3 = data.copy().astype(dtype_new3)
print(data3)
print(data3.dtype)
names[1] = 'baz'
data4 = data3.copy()
data4.dtype.names = names
print(data4)
print(data4.dtype)
その結果、正しい出力が得られます
[(1.0, 2.0) (3.0, 4.0)]
[('foo', '<f8'), ('bar', '<f8')]
[(1.0, 2.0) (3.0, 4.0)]
[('foo', '<f8'), ('baz', '<f8')]
がastype
構造化された dtype で呼び出されると、numpy は各コンポーネントの名前を照合し、指定された型をコンテンツに適用するようです (ここで推測するだけで、ソース コードを見ていません)。この変換をすべて一度に行う方法はありますか (つまり、形式の名前とアップコンバージョン)、それとも単に手順を実行する必要がありますか? (段階的に行う必要がある場合は大したことではありませんが、これを行うための単一のステップの方法がないのは奇妙に思えます。)