2

Pythonには比較的新しいので、私が見つけていない明らかな答えがあればすみません。

pytable に格納するという最終目標を持って、いくつかの一時的に連続したバイナリ ファイルを numpy レコード配列に読み込んでいます。私が予想する問題は、すべてのファイルが同じフィールドまたは同じフィールド順序を持っていない可能性があることです。フィールド ラベルまたはインデックスのいずれかを使用して、再配列の列 (行ではなく) を並べ替える numpy 関数を探していました。さらに良いのは、再配列を別の配列に追加するときに、これを行い、欠落している列を説明する関数です。以下は、私が念頭に置いていたもののサンプルです。

#-------script------------
Myarray1 = np.array([(1,2,3),(1,2,3),(1,2,3)], {'names': ('a','b','c'), 'formats': ('f4', 'f4', 'f4')})
Myarray2 = np.array([(2,1,4,3),(2,1,4,3),(2,1,4,3)], {'names': ('b','a','d','c'), 'formats': ('f4', 'f4', 'f4', 'f4')})
Myarray3 = SomeColumnSortFunction(Myarray2, sortorder=[2,1,4,3])
Myarray4 = SomeBetterVerticalStackFunction(Myarray1,Myarray2)
#
print(Myarray1)
print()
print(Myarray2)
print()
print(Myarray3)
print()
print(Myarray4)

#---------- Wished for Output -------------
[(1.0, 2.0, 3.0) (1.0, 2.0, 3.0) (1.0, 2.0, 3.0)],
 dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'i4')]

[(2.0, 1.0, 4.0, 3.0) (2.0, 1.0, 4.0, 3.0) (2.0, 1.0, 4.0, 3.0)],
dtype=[('b', 'i4'), ('a', 'i4'), ('d', 'i4'), ('c', 'i4')]


[(1.0, 2.0, 3.0, 4.0) (1.0, 2.0, 3.0, 4.0) (1.0, 2.0, 3.0, 4.0)] 
dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'i4'), ('d', 'i4')]

[(1.0, 2.0, 3.0, NaN) (1.0, 2.0, 3.0, NaN) (1.0, 2.0, 3.0, NaN),
 (1.0, 2.0, 3.0, 4.0) (1.0, 2.0, 3.0, 4.0) (1.0, 2.0, 3.0, 4.0)] 
dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'i4'), ('d', 'i4')]
4

2 に答える 2

5
  • 構造化配列のフィールドを並べ替えたい場合は、派手なインデックスを使用してください。

    MyArray3 = MyArray2[['a','b','c','d']]
    

    整数を使用してフィールドを並べ替えたい場合は、次のようなものを使用できます。

    order = [1,0,3,2]
    names = MyArray2.dtype.names
    MyArray3 = MyArray2[[names[i] for i in order]]
    

    (あなたのsortorder=[2,1,4,3]では、イテラブルの最初のインデックスが 0 であることをおそらく忘れていたでしょう...)

  • 構造化された配列を積み重ねるには、numpy.lib.recfunctionsサブモジュール、stack_arrays特に関数を見てください。import numpy.lib.recfunctions明示的に使用する必要があることに注意してください

これがドキュメントストリングです

stack_arrays(arrays, defaults=None, usemask=True, asrecarray=False, autoconvert=False)

Superposes arrays fields by fields

Parameters
----------
seqarrays : array or sequence
    Sequence of input arrays.
defaults : dictionary, optional
    Dictionary mapping field names to the corresponding default values.
usemask : {True, False}, optional
    Whether to return a MaskedArray (or MaskedRecords is `asrecarray==True`)
    or a ndarray.
asrecarray : {False, True}, optional
    Whether to return a recarray (or MaskedRecords if `usemask==True`) or
    just a flexible-type ndarray.
autoconvert : {False, True}, optional
    Whether automatically cast the type of the field to the maximum.

Examples
--------
>>> from numpy.lib import recfunctions as rfn
>>> x = np.array([1, 2,])
>>> rfn.stack_arrays(x) is x
True
>>> z = np.array([('A', 1), ('B', 2)], dtype=[('A', '|S3'), ('B', float)])
>>> zz = np.array([('a', 10., 100.), ('b', 20., 200.), ('c', 30., 300.)],
...   dtype=[('A', '|S3'), ('B', float), ('C', float)])
>>> test = rfn.stack_arrays((z,zz))
>>> test
masked_array(data = [('A', 1.0, --) ('B', 2.0, --) ('a', 10.0, 100.0) ('b', 20.0, 200.0)
 ('c', 30.0, 300.0)],
             mask = [(False, False, True) (False, False, True) (False, False, False)
 (False, False, False) (False, False, False)],
       fill_value = ('N/A', 1e+20, 1e+20),
            dtype = [('A', '|S3'), ('B', '<f8'), ('C', '<f8')])
于 2012-09-01T14:18:47.930 に答える