2

約1億5000万ポイントの時系列があります。300万ポイントにズームインする必要があります。つまり、この1億5000万ポイントの時系列で、これらの300万の関心領域のそれぞれを取り巻く100の時点を抽出する必要があります。

試み:

 def get_waveforms(data,spiketimes,lookback=100,lookahead=100):
      answer = zeros((len(spiketimes),(lookback+lookahead)))
      duration = len(data)
      for i in xrange(len(spiketimes)):
          if(spiketimes[i] - lookback) > 0 and spiketimes[i] + lookahead) < duration:
               answer[i,:] = data[(spiketimes[i]-lookback):(spiketimes[i]+lookahead)]
      return answer

これは私のMacで利用可能なすべてのメモリを使い果たします。渡そうとすると爆発しlen(array) > 100000ます。あるアレイの一部を別のアレイに基づいて引き出すための、よりメモリ効率の高い、または(うまくいけば)よりエレガントなアプローチはありますか?

関連 この回答は関連しています。ただし、それを適用してループを回避する方法が正確にはわかりません。事実上、ブール行列の列を使用して時系列ベクトルに何度もインデックスを付けますか?

4

1 に答える 1

1

floatの配列を割り当てている200 * len(spiketimes)ため、100,000 個のアイテムのspiketimes場合、約 160 MB しかないはずですが、これはあまり多くないようです。一方、 1,000,000spiketimesになると、一部のシステムでは 1.6 GB の単一アレイが限界になる可能性があります。メモリがある場合は、次のような方法で抽出をベクトル化できます。

def get_waveforms(data, spiketimes, lookback=100, lookahead=100) :
    offsets = np.arange(-lookback, lookahead)
    indices = spiketimes + offsets[:, None]
    ret = np.take(data, indices, mode='clip')
    ret[:, spiketimes < lookback] = 0
    ret[:, spiketimes + lookahead >= len(data)] = 0
    return ret

関数内でループを使用するミミックspiketimesのエッジに近すぎる処理。data

非常に多くのデータがある場合に行うべき賢明な方法は、データを分析することです。これはベクトル化するのが難しくなります (または、少なくともその方法を理解していません) が、データをコピーしていないため、Python ループはそれほど遅くはなりません。

def get_waveforms_views(data, spiketimes, lookback=100, lookahead=100) :
    ret = []
    for j in spiketimes :
        if j < lookback or j + lookahead >= len(data) :
            ret.append(None)
        else :
            ret.append(data[j - lookback:j + lookahead])
    return ret

次のテスト データを使用します。

data_points, num_spikes = 1000000, 10000

data = np.random.rand(data_points)
spiketimes = np.random.randint(data_points, size=(num_spikes))

私はこれらのタイミングを取得します:

In [2]: %timeit get_waveforms(data, spiketimes)
1 loops, best of 3: 320 ms per loop

In [3]: %timeit get_waveforms_views(data, spiketimes)
1 loops, best of 3: 313 ms per loop
于 2013-02-22T04:16:53.600 に答える