私は次の形式のnumpy構造化配列を持っています:
x = np.array([(1,2,3)]*2, [('t', np.int16), ('x', np.int8), ('y', np.int8)])
't'
ここで、またはのいずれかと'x'
連携するビューをこの配列に生成したいと思います'y'
。通常の構文では、コピーが作成されます。
v_copy = x[['t', 'y']]
v_copy
#array([(1, 3), (1, 3)],
# dtype=[('t', '<i2'), ('y', '|i1')])
v_copy.base is None
#True
2つのフィールドを選択することは「ファンシーインデックス」であり、その時点でnumpyはあきらめてコピーを作成するため、これは予想外のことではありません。私の実際の記録は大きいので、絶対にコピーを避けたいです。
numpyのストライドメモリモデル内で必要な要素にアクセスできないというのは、まったく真実ではありません。メモリ内の個々のバイトを見る:
x.view(np.int8)
#array([1, 0, 2, 3, 1, 0, 2, 3], dtype=int8)
必要な歩みを理解することができます:
v = np.recarray((2,2), [('b', np.int8)], buf=x, strides=(4,3))
v
#rec.array([[(1,), (3,)],
# [(1,), (3,)]],
# dtype=[('b', '|i1')])
v.base is x
#True
明らかにv
、コピーを作成せずにメモリ内の正しい場所を指しています。残念ながら、numpyでは、これらのメモリ位置を元のデータ型として再解釈することはできません。
v_view = v.view([('t', np.int16), ('y', np.int8)])
#ValueError: new type not compatible with array.
numpyをだましてこのキャストを実行させ、コピーを作成せずにとv_view
同等の配列を作成する方法はありますか?で行われているv_copy
ように、おそらく直接作業していますか?v.__array_interface__
np.lib.stride_tricks.as_strided()