के बाद से इस सवाल का 5 साल पुराना है मैं इस समस्या थी और,, मैं सभी मानक फिर से करना और टोंटी की वाक्य रचना बदलना पड़ा (वहाँ अब और कोई partsort
, यहहै 210 अब)।
मैंने पुनर्प्राप्त तत्वों की संख्या को छोड़कर, kwgoodman के रूप में एक ही तर्क का उपयोग किया, जो मैंने 50 तक बढ़ाया (मेरी विशेष स्थिति में बेहतर फिट करने के लिए)।
bottleneck 1: 01.12 ms per loop
bottleneck 2: 00.95 ms per loop
pandas : 01.65 ms per loop
heapq : 08.61 ms per loop
numpy : 12.37 ms per loop
numpy 2 : 00.95 ms per loop
तो, bottleneck_2 और numpy_2 (adas के समाधान) बंधे गया:
मैं इन परिणामों मिला है। लेकिन, np.percentile
(numpy_2) का उपयोग करके आपके पास पहले से सॉर्ट किए गए शीर्ष शीर्ष तत्व हैं, जो अन्य समाधानों के मामले में नहीं हैं। दूसरी तरफ, यदि आप उन तत्वों की अनुक्रमणिका पर भी रुचि रखते हैं, तो प्रतिशत उपयोगी नहीं है।
मैंने पांडा भी जोड़ा, जो उपलब्ध होने पर बाधा का उपयोग करता है (http://pandas.pydata.org/pandas-docs/stable/install.html#recommended-dependencies)।यदि आपके पास पहले से ही एक पांडा श्रृंखला या डेटाफ्रेम है, तो आप अच्छे हाथों में हैं, बस nlargest
का उपयोग करें और आप कर चुके हैं।
बेंचमार्क के लिए इस्तेमाल किया कोड के रूप में (अजगर 3, कृपया) इस प्रकार है:
import time
import numpy as np
import bottleneck as bn
import pandas as pd
import heapq
def bottleneck_1(a, n):
return -bn.partition(-a, n)[:n]
def bottleneck_2(a, n):
return bn.partition(a, a.size-n)[-n:]
def numpy(a, n):
return a[a.argsort()[-n:]]
def numpy_2(a, n):
M = a.shape[0]
perc = (np.arange(M-n,M)+1.0)/M*100
return np.percentile(a,perc)
def pandas(a, n):
return pd.Series(a).nlargest(n)
def hpq(a, n):
return heapq.nlargest(n, a)
def do_nothing(a, n):
return a[:n]
def benchmark(func, size=1000000, ntimes=100, topn=50):
t1 = time.time()
for n in range(ntimes):
a = np.random.rand(size)
func(a, topn)
t2 = time.time()
ms_per_loop = 1000000 * (t2 - t1)/size
return ms_per_loop
t1 = benchmark(bottleneck_1)
t2 = benchmark(bottleneck_2)
t3 = benchmark(pandas)
t4 = benchmark(hpq)
t5 = benchmark(numpy)
t6 = benchmark(numpy_2)
t0 = benchmark(do_nothing)
print("bottleneck 1: {:05.2f} ms per loop".format(t1 - t0))
print("bottleneck 2: {:05.2f} ms per loop".format(t2 - t0))
print("pandas : {:05.2f} ms per loop".format(t3 - t0))
print("heapq : {:05.2f} ms per loop".format(t4 - t0))
print("numpy : {:05.2f} ms per loop".format(t5 - t0))
print("numpy 2 : {:05.2f} ms per loop".format(t6 - t0))
की
संभावित डुप्लिकेट [कैसे एक numpy सरणी में एन अधिकतम मान के सूचकांकों पाने के लिए?] (Http: // stackoverflow .com/प्रश्न/6910641/कैसे-से-get-indices-of-n-max-values-in-a-numpy-array) – Seanny123