2014-09-03 29 views
6

में जोड़ने के लिए मैं एक numpy सरणी है और मैं बस संलग्न का उपयोग कर, इस तरह यह करने के लिए एक आइटम जोड़ सकते हैं:इष्टतम तरीका numpy सरणी

numpy.append(myarray, 1) 

इस मामले मैं सिर्फ पूर्णांक 1 संलग्न हैं।

लेकिन क्या यह एक सरणी में शामिल करने का सबसे तेज़ तरीका है? मेरे पास एक बहुत लंबी सरणी है जो हजारों में दौड़ती है।

या क्या सरणी को अनुक्रमणित करना और इसे सीधे असाइन करना बेहतर है? इस तरह:

myarray[123] = 1 

उत्तर

9

NumPy सरणी के लिए जोड़ बहुत अक्षम है। ऐसा इसलिए है क्योंकि दुभाषिया को प्रत्येक चरण में संपूर्ण सरणी के लिए स्मृति को खोजने और असाइन करने की आवश्यकता होती है। आवेदन के आधार पर, बहुत बेहतर रणनीतियां हैं।

आप पहले से लंबाई पता है, यह सरणी पूर्व आवंटित np.ones, np.zeros, या np.empty की तरह एक समारोह का उपयोग करने के लिए सबसे अच्छा है।

desired_length = 500 
results = np.empty(desired_length) 
for i in range(desired_length): 
    results[i] = i**2 

आप लंबाई को नहीं जानते हैं, यह शायद अधिक एक नियमित रूप से सूची में अपने परिणामों को रखने के लिए और एक सरणी के लिए इसे बाद में परिवर्तित करने के लिए कुशल है।

results = [] 
while condition: 
    a = do_stuff() 
    results.append(a) 
results = np.array(results) 

यहाँ अपने कंप्यूटर पर कुछ समय कर रहे हैं।

def pre_allocate(): 
    results = np.empty(5000) 
    for i in range(5000): 
     results[i] = i**2 
    return results 

def list_append(): 
    results = [] 
    for i in range(5000): 
     results.append(i**2) 
    return np.array(results) 

def numpy_append(): 
    results = np.array([]) 
    for i in range(5000): 
     np.append(results, i**2) 
    return results 

%timeit pre_allocate() 
# 100 loops, best of 3: 2.42 ms per loop 

%timeit list_append() 
# 100 loops, best of 3: 2.5 ms per loop 

%timeit numpy_append() 
# 10 loops, best of 3: 48.4 ms per loop 

तो आपको लगता है कि दोनों पूर्व आवंटन और एक सूची का उपयोग कर फिर रूपांतरण से बहुत तेजी से कर रहे हैं देख सकते हैं।

1

यदि आप रन के अंत में सरणी के आकार को जानते हैं, तो यह उचित आकार की सरणी आवंटित करने के लिए बहुत तेज़ होगा और फिर मान सेट करें। यदि आपको उड़ान भरने की आवश्यकता है, तो संभवतः एक बार में एक तत्व नहीं करने का प्रयास करना बेहतर होगा, इसके बजाय कई बार प्रतियां उत्पन्न करने से बचने के लिए जितनी बार संभव हो सके उतनी बार जोड़ना। आप np.append, np.hstack, np.concatenate के समय में अंतर की कुछ प्रोफाइलिंग भी करना चाहेंगे। आदि