1

私はこれに対するエレガントな解決策を探しています:

data = np.loadtxt(file)
# data[:,0] is a time
# data[:,1] is what I want to extract
mean = 0.0
count = 0
for n in xrange(np.size(data[:,0])):
    if data[n,0] >= tstart and data[n,0] <= tend:
        mean = mean + data[n,1]
        count = count + 1

mean = mean / float(count)

あるいは、最初に2D配列を抽出してから適用np.meanすることもできると思いますが、これをよりエレガントにするためのリスト内包表記の良さがあると思います(私はFORTRANのバックグラウンドから来ています...)。私は次のようなことを考えていましiた(インデックスではないので明らかに間違っています):

np.mean([x for x in data[i,1] for i in data[:,0] if i >= tstart and i <= tend])
4

1 に答える 1

4

numpyでは、listcompsではなく、インデックス作成の目的でリストと配列を使用できます。具体的には、作業しているような2D配列があるとします。

>>> import numpy as np
>>> data = np.arange(20).reshape(10, 2)
>>> data
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11],
       [12, 13],
       [14, 15],
       [16, 17],
       [18, 19]])

最初の列を取得できます。

>>> ts = data[:,0] 
>>> ts
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])

そして、必要な用語に対応するブール配列を作成します。

>>> (ts >= 2) & (ts <= 6)
array([False,  True,  True,  True, False, False, False, False, False, False], dtype=bool)

次に、これを使用して、関心のある列の要素を選択できます。

>>> data[:,1][(ts >= 2) & (ts <= 6)]
array([3, 5, 7])

そして最後にその意味を取ります:

>>> np.mean(data[:,1][(ts >= 2) & (ts <= 6)])
5.0

または、1行で:

>>> np.mean(data[:,1][(data[:,0] >= 2) & (data[:,0] <= 6)])
5.0

[編集:これdata[:,1][(data[:,0] >= 2) & (data[:,0] <= 6)].mean()も機能します。メソッドを使用できることを常に忘れています。]

于 2012-07-11T04:19:32.077 に答える