Mengurangi array numpy untuk menggambar grafik

Saya ingin menggambar grafik di aplikasi python saya, tetapi array sumber numpy terlalu besar untuk melakukan ini (sekitar 1'000'000+). Saya ingin mengambil nilai rata-rata untuk elemen tetangga. Ide pertama adalah melakukannya dalam gaya C++:

step = 19000 # every 19 seconds (for example) make new point with neam value
dt = <ordered array with time stamps>
value = <some random data that we want to draw>

index = dt - dt % step
cur = 0
res = []

while cur < len(index):
    next = cur
    while next < len(index) and index[next] == index[cur]:
        next += 1
    res.append(np.mean(value[cur:next]))
    cur = next

tapi solusi ini bekerja sangat lambat. Saya mencoba melakukan seperti ini:

step = 19000 # every 19 seconds (for example) make new point with neam value
dt = <ordered array with time stamps>
value = <some random data that we want to draw>

index = dt - dt % step
data = np.arange(index[0], index[-1] + 1, step)
res = [value[index == i].mean() for i in data]
pass

Solusi ini lebih lambat dibandingkan solusi pertama. Apa solusi terbaik untuk masalah ini?


person Artem Mezhenin    schedule 20.06.2012    source sumber


Jawaban (1)


np.histogram dapat memberikan jumlah pada tempat sampah yang berubah-ubah. Jika Anda memiliki deret waktu, misalnya:

import numpy as np

data = np.random.rand(1000)          # Random numbers between 0 and 1
t = np.cumsum(np.random.rand(1000))  # Random time series, from about 1 to 500

maka Anda dapat menghitung jumlah binned dalam interval 5 detik menggunakan np.histogram:

t_bins = np.arange(0., 500., 5.)       # Or whatever range you want
sums = np.histogram(t, t_bins, weights=data)[0]

Jika Anda menginginkan nilai rata-rata, bukan jumlah, hilangkan bobotnya dan gunakan penghitungan bin:

means = sums / np.histogram(t, t_bins)][0]

Metode ini mirip dengan yang ada di jawaban ini.

person marshall.ward    schedule 20.06.2012