স্কিপি / নম্পী দিয়ে অজগরটিতে ডেটা বেনিং


108

পূর্বনির্ধারিত বাক্সগুলিতে একটি অ্যারে গড়ে গড়ে তোলার আরও কার্যকর উপায় আছে কি? উদাহরণস্বরূপ, আমার সংখ্যার একটি অ্যারে এবং বিন অ্যারে এবং বিনের সূচনা এবং শেষ অবস্থানগুলির সাথে সম্পর্কিত একটি অ্যারে রয়েছে, এবং আমি কেবল এই বিনগুলিতে গড়টি নিতে চাই? আমার নীচে কোড রয়েছে যা এটি নীচে করে তবে আমি ভাবছি কীভাবে এটি কেটে ফেলা যায় এবং উন্নত করা যায়। ধন্যবাদ।

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

উত্তর:


181

এটি সম্ভবত দ্রুত এবং ব্যবহার করা সহজ numpy.digitize():

import numpy
data = numpy.random.random(100)
bins = numpy.linspace(0, 1, 10)
digitized = numpy.digitize(data, bins)
bin_means = [data[digitized == i].mean() for i in range(1, len(bins))]

এর বিকল্পটি হ'ল numpy.histogram():

bin_means = (numpy.histogram(data, bins, weights=data)[0] /
             numpy.histogram(data, bins)[0])

নিজের জন্য চেষ্টা করুন কোনটি দ্রুত ... :)


1
আমি একটি ডিফ দেখছি না - কোনটি দ্রুত?

4
@ ব্যবহারকারী: আমি জানি না কোনটি আপনার ডেটা এবং পরামিতিগুলির জন্য দ্রুত। উভয় পদ্ধতিই আপনার চেয়ে দ্রুত হওয়া উচিত এবং আমি আশা করব যে histogram()প্রচুর পরিমাণে বিনের জন্য পদ্ধতিটি দ্রুত হবে। তবে আপনাকে নিজের প্রোফাইল করতে হবে, আমি আপনার পক্ষে এটি করতে পারি না।
সোভেন মারনাচ

39

স্কিপি (> = 0.11) ফাংশন scipy.stats.binned_statistic বিশেষভাবে উপরের প্রশ্নটির ঠিকানা দেয়।

পূর্ববর্তী উত্তরের মতো একই উদাহরণের জন্য, স্কিপি সমাধান হবে

import numpy as np
from scipy.stats import binned_statistic

data = np.random.rand(100)
bin_means = binned_statistic(data, data, bins=10, range=(0, 1))[0]

16

এই থ্রেড কেন necroed হয়েছে তা নিশ্চিত নয়; তবে এখানে একটি 2014 অনুমোদিত উত্তর রয়েছে, যা খুব দ্রুত হওয়া উচিত:

import numpy as np

data = np.random.rand(100)
bins = 10
slices = np.linspace(0, 100, bins+1, True).astype(np.int)
counts = np.diff(slices)

mean = np.add.reduceat(data, slices[:-1]) / counts
print mean

3
আপনি একটি পৃথক প্রশ্নের উত্তর দিচ্ছেন। উদাহরণস্বরূপ আপনার mean[0] = np.mean(data[0:10]), যখন সঠিক উত্তরটি হওয়া উচিতnp.mean(data[data < 10])
রুগেরো তুররা

5

Numpy_indexed প্যাকেজ (দাবিত্যাগ: আমি সংশ্লিষ্ট লেখক নই) কার্যকারিতা দক্ষতার এই ধরনের অপারেশন সম্পাদন রয়েছে:

import numpy_indexed as npi
print(npi.group_by(np.digitize(data, bins)).mean(data))

এটি মূলত আমি আগে পোস্ট করা একই সমাধান; তবে এখন পরীক্ষাগুলি এবং সমস্ত সহ একটি দুর্দান্ত ইন্টারফেসে আবৃত :)


3

আমি যুক্ত করব, এবং এই প্রশ্নের উত্তর দেওয়ার জন্য হিস্টোগ্রাম 2 ডি পাইথন ব্যবহার করে বিন মানগুলি খুঁজে বের করব যে স্কিপিটিতে একটি বা একাধিক সেট ডেটার জন্য দ্বি মাত্রিক বিন্যাসিত পরিসংখ্যান গণনা করার জন্য বিশেষভাবে তৈরি একটি ফাংশন রয়েছে

import numpy as np
from scipy.stats import binned_statistic_2d

x = np.random.rand(100)
y = np.random.rand(100)
values = np.random.rand(100)
bin_means = binned_statistic_2d(x, y, values, bins=10).statistic

scipy.stats.binned_statistic_dd ফাংশনটি উচ্চ মাত্রার ডেটাসেটের জন্য এই ফানসিওনের একটি সাধারণীকরণ


1

আর একটি বিকল্প হল ufunc.at ব্যবহার করা। এই পদ্ধতিটি নির্দিষ্ট সূচকগুলিতে একটি পছন্দসই অপারেশন প্রয়োগ করে প্রয়োগ করে। অনুসন্ধানের পদ্ধতিটি ব্যবহার করে আমরা প্রতিটি ডেটাপয়েন্টের জন্য বিন অবস্থান পেতে পারি। তারপরে আমরা বিন_ইন্ডেক্সে প্রদত্ত সূচকটিতে হিস্টোগামের অবস্থানটি 1 দ্বারা বাড়িয়ে আমরা ব্যবহার করতে পারি, প্রতিবার যখন আমরা বিন সূচকগুলিতে একটি সূচকের মুখোমুখি হই।

np.random.seed(1)
data = np.random.random(100) * 100
bins = np.linspace(0, 100, 10)

histogram = np.zeros_like(bins)

bin_indexes = np.searchsorted(bins, data)
np.add.at(histogram, bin_indexes, 1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.