0

ファイル データを numpy 再配列にロードし、その後、既知のギャップを NaN で埋めています。ただし、ギャップを埋めて配列を再割り当てするために、再配列のフィールドのサイズを増やす方法が見つかりません。私の問題の例 (以下) は、大きな形状から小さな形状へのブロードキャストに関する値エラーをスローします。

Python 2.7.6.1、numpy 1.8.1-6 を使用

ありがとう、ロブ

import numpy as np
import numpy.ma as ma

a1 = np.arange(0,20,1)
a2 = np.arange(100,120,1)

X = np.recarray((20,), dtype=[('g', float), ('h', int)])
X['g'][:] = a1
X['h'][:] = a2

for afield in X.dtype.names:
    Y = X[afield].copy(order='K')
    for icnt in range(0,3):
        Y = np.insert(Y, 5, np.nan, axis=0)

    ma.resize(X[afield], (len(Y),) )
    X[afield][:] =  Y[:]
4

1 に答える 1

1

再配列 X を「展開」しませんでした。再配列は、ラベル (名前/列) ごとに展開できませんma.resize。渡された配列を変更せずに、新しい形状の新しい (マスクされた) 配列をma.resize 返しますが、コードでは戻り値を使用していないことに注意してください。したがって、その行は何もしません。明確にするために:

X[afield] = ma.resize(X[afield], (len(Y),) )

レコード配列はラベル (「列」) ごとに拡張できないため、これも機能しません。再配列を拡張する場合は、( の関数を使用して) 一度に行う必要があるnp.lib.recfunctionsため、まったく新しい列を追加するか、既存のすべての列に複数の新しいレコードを追加します。

そうは言っても、これを試してみませんか:

>>> Y = np.arange(20, dtype=np.float)
>>> Ynan = np.insert(Y, (5,)*3, (np.nan,)*3)
>>> X = np.rec.fromarrays([Ynan, Ynan+100], names='g,h')
>>> X
rec.array([(0.0, 100.0), (1.0, 101.0), (2.0, 102.0), (3.0, 103.0),
       (4.0, 104.0), (nan, nan), (nan, nan), (nan, nan), (5.0, 105.0),
       (6.0, 106.0), (7.0, 107.0), (8.0, 108.0), (9.0, 109.0),
       (10.0, 110.0), (11.0, 111.0), (12.0, 112.0), (13.0, 113.0),
       (14.0, 114.0), (15.0, 115.0), (16.0, 116.0), (17.0, 117.0),
       (18.0, 118.0), (19.0, 119.0)], 
      dtype=[('g', '<f8'), ('h', '<f8')])

np.nanは浮動小数点型であるため、2 列目 (ラベル 'h') を int に変換できないことに注意してください。試してみると、ガベージが発生します。

>>> X['h'].astype(np.int)
array([                 100,                  101,                  102,
                        103,                  104, -9223372036854775808,
       -9223372036854775808, -9223372036854775808,                  105,
                        106,                  107,                  108,
                        109,                  110,                  111,
                        112,                  113,                  114,
                        115,                  116,                  117,
                        118,                  119])

あなたが求めているのは、実際にはマスクされたレコード配列だと思います:

>>> import numpy.ma.mrecords as mrecords
>>> 
>>> X = np.rec.fromarrays([Ynan, (Ynan+100).astype(np.int)], names='g,h')
>>> Z = np.ma.array(X, mask=np.isnan(Ynan))
>>> Z2 = Z.view(mrecords.mrecarray)
>>> 
>>> Z2
masked_records(
    g : [0.0 1.0 2.0 3.0 4.0 -- -- -- 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0
 15.0 16.0 17.0 18.0 19.0]
    h : [100 101 102 103 104 -- -- -- 105 106 107 108 109 110 111 112 113 114 115
 116 117 118 119]
    fill_value : (1e+20, 999999)
              )
>>> 
>>> Z2['h']
masked_array(data = [100 101 102 103 104 -- -- -- 105 106 107 108 109 110 111 112 113 114 115
 116 117 118 119],
             mask = [False False False False False  True  True  True False False False False
 False False False False False False False False False False False],
       fill_value = 999999)

ご覧のとおり、Z2 の「列」には目的の dtype (float と int) があり、列名でアクセスでき、データの一部がマスクされています。

于 2014-11-11T13:51:24.467 に答える