adakah cara yang lebih efisien untuk mengambil rata-rata array di nampan yang telah ditentukan sebelumnya? misalnya, saya memiliki array angka dan array yang sesuai dengan posisi awal dan akhir bin dalam array itu, dan saya hanya ingin mengambil mean di tempat sampah itu? Saya memiliki kode yang melakukannya di bawah ini tetapi saya bertanya-tanya bagaimana hal itu dapat dipotong dan ditingkatkan. Terima kasih.
from scipy import *
from numpy import *
def get_bin_mean(a, b_start, b_end):
ind_upper = nonzero(a >= b_start)[0]
a_upper = a[ind_upper]
a_range = a_upper[nonzero(a_upper < b_end)[0]]
mean_val = mean(a_range)
return mean_val
data = rand(100)
bins = linspace(0, 1, 10)
binned_data = []
n = 0
for n in range(0, len(bins)-1):
b_start = bins[n]
b_end = bins[n+1]
binned_data.append(get_bin_mean(data, b_start, b_end))
print binned_data
histogram()
metode ini lebih cepat untuk sejumlah besar bin. Tetapi Anda harus membuat profil sendiri, saya tidak dapat melakukan ini untuk Anda.Fungsi Scipy (> = 0.11) scipy.stats.binned_statistic secara khusus menjawab pertanyaan di atas.
Untuk contoh yang sama seperti pada jawaban sebelumnya, solusi Scipy adalah
sumber
Tidak yakin mengapa utas ini perlu diperbaiki; tapi berikut adalah jawaban yang disetujui tahun 2014, yang seharusnya jauh lebih cepat:
sumber
mean[0] = np.mean(data[0:10])
, sementara jawaban yang benar seharusnyanp.mean(data[data < 10])
The numpy_indexed paket (disclaimer: Saya penulisnya) berisi fungsi untuk secara efisien melakukan operasi jenis ini:
Ini pada dasarnya adalah solusi yang sama seperti yang saya posting sebelumnya; tapi sekarang dibungkus dengan antarmuka yang bagus, dengan tes dan semuanya :)
sumber
Saya akan menambahkan, dan juga untuk menjawab pertanyaan menemukan nilai bin rata-rata menggunakan histogram2d python bahwa scipy juga memiliki fungsi yang dirancang khusus untuk menghitung statistik biner dua dimensi untuk satu atau lebih set data
fungsi scipy.stats.binned_statistic_dd adalah generalisasi dari fungsi ini untuk dataset dimensi yang lebih tinggi
sumber
Alternatif lain adalah dengan menggunakan ufunc.at. Metode ini menerapkan operasi yang diinginkan di tempat pada indeks tertentu. Kita bisa mendapatkan posisi bin untuk setiap titik data menggunakan metode searchsorted. Kemudian kita dapat menggunakan di untuk menambah 1 posisi histogram pada indeks yang diberikan oleh bin_indexes, setiap kali kita menemukan indeks di bin_indexes.
sumber