7

非常に単純な質問: 複数の列を持つ構造化配列があり、それらの一部 (ただし複数) だけを別の既存の配列で埋めたいと思います。

これは私がしようとしているものです:

strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)])
x = np.array([2, 3])
strc[['x', 'y']][0] = x

これにより、次の将来の警告が表示されます。

main :1: FutureWarning: Numpy は、numpy.diagonal またはレコード配列内の複数のフィールドを選択することによって返された配列に書き込みを行っている (可能性がある) ことを検出しました。このコードは、将来の numpy リリースで壊れる可能性があります。詳細については、numpy.diagonal または arrays.indexing のリファレンス ドキュメントを参照してください。手っ取り早い解決策は、明示的なコピーを作成することです (たとえば、arr.diagonal().copy() または arr[['f0','f1']].copy() を実行します)。

しかし、これは警告ですが、構造化配列は満たされません。これまでのところ、両方の配列を繰り返し処理しており、機能していますが、それは非常に非効率的だと思います。より良い方法はありますか?

4

1 に答える 1

12

すべてのフィールドの dtype が同じ場合、ビューを作成できます。

import numpy as np
strc = np.zeros(4, dtype=[('x', int), ('y', int), ('z', int)])
strc_view = strc.view(int).reshape(len(strc), -1)
x = np.array([2, 3])
strc_view[0, [0, 1]] = x

構造化配列の列ビューを作成できる一般的なソリューションが必要な場合は、次を試すことができます。

import numpy as np
strc = np.zeros(3, dtype=[('x', int), ('y', float), ('z', int), ('t', "i8")])

def fields_view(arr, fields):
    dtype2 = np.dtype({name:arr.dtype.fields[name] for name in fields})
    return np.ndarray(arr.shape, dtype2, arr, 0, arr.strides)

v1 = fields_view(strc, ["x", "z"])
v1[0] = 10, 100

v2 = fields_view(strc, ["y", "z"])
v2[1:] = [(3.14, 7)]

v3 = fields_view(strc, ["x", "t"])

v3[1:] = [(1000, 2**16)]

print strc

出力は次のとおりです。

[(10, 0.0, 100, 0L) (1000, 3.14, 7, 65536L) (1000, 3.14, 7, 65536L)]
于 2014-02-17T00:24:00.037 に答える