2014-05-13 12 views
8

मैं "संचयी न्यूनतम" सरणी की गणना करना चाहते हैं - मूल रूप से, प्रत्येक सूचकांक अप करने के लिए एक सरणी के न्यूनतम मूल्य जैसे:गिना जा रहा है संचयी न्यूनतम

import numpy as np 
nums = np.array([5.,3.,4.,2.,1.,1.,2.,0.]) 
cumulative_min = np.zeros(nums.size, dtype=float) 
for i,num in enumerate(nums): 
    cumulative_min[i] = np.min(nums[0:i+1]) 

यह काम करता है (यह रिटर्न सही सरणी ([5., 3., 3., 2., 1., 1., 1., 0.]) ), लेकिन अगर मैं कर सकता हूं तो मैं लूप से बचना चाहता हूं। मैंने सोचा कि यह 2-डी सरणी बनाने के लिए तेज़ हो सकता है और np.amin() फ़ंक्शन का उपयोग कर सकता है, लेकिन मुझे इसके लिए एक लूप की भी आवश्यकता है।

उत्तर

16

किसी भी 2-तर्क के लिए NumPy universal function, इसकी accumulate विधि उस फ़ंक्शन का संचयी संस्करण है।

>>> numpy.minimum.accumulate([5,4,6,10,3]) 
array([5, 4, 4, 4, 3]) 
1

एक मैट्रिक्स जो कम त्रिकोण (np.tril) अपने सरणी nums और अपने ऊपरी त्रिकोण के मूल्यों से भर जाता है बनाएँ (np.triu, दूसरा पैरामीटर 1 के साथ है, तो विकर्ण रहता मुक्त) सरणी के अधिकतम से भरा है। (संपादित:। अधिकतम करने के बजाय, सरणी के पहले तत्व बेहतर तरीका है -> टिप्पणियाँ)

nums = np.array([5.,3.,4.,2.,1.,1.,2.,0.]) 
oneSquare = np.ones((nums.size, nums.size)) 

A = nums * np.tril(oneSquare) 
B = np.triu(oneSquare, 1) * nums[0] 
A, B 

आउट:

(array([[ 5., 0., 0., 0., 0., 0., 0., 0.], 
     [ 5., 3., 0., 0., 0., 0., 0., 0.], 
     [ 5., 3., 4., 0., 0., 0., 0., 0.], 
     [ 5., 3., 4., 2., 0., 0., 0., 0.], 
     [ 5., 3., 4., 2., 1., 0., 0., 0.], 
     [ 5., 3., 4., 2., 1., 1., 0., 0.], 
     [ 5., 3., 4., 2., 1., 1., 2., 0.], 
     [ 5., 3., 4., 2., 1., 1., 2., 0.]]), 
array([[ 0., 5., 5., 5., 5., 5., 5., 5.], 
     [ 0., 0., 5., 5., 5., 5., 5., 5.], 
     [ 0., 0., 0., 5., 5., 5., 5., 5.], 
     [ 0., 0., 0., 0., 5., 5., 5., 5.], 
     [ 0., 0., 0., 0., 0., 5., 5., 5.], 
     [ 0., 0., 0., 0., 0., 0., 5., 5.], 
     [ 0., 0., 0., 0., 0., 0., 0., 5.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0.]])) 

अब प्रत्येक पंक्ति की न्यूनतम ले :

(A+B).min(axis=1) 

आउट:

012,351,
array([ 5., 3., 3., 2., 1., 1., 1., 0.]) 
+0

तुम भी ऊपरी त्रिकोण में मूल्यों के लिए अनंत इस्तेमाल कर सकते हैं, बल्कि 'nums.max से()': इस प्रकार, numpy.minimum.accumulate आप जो खोज रहे हैं है। – Blckknght

+0

@ ब्लैककॉन्ग ने इसे आजमाया, पहली नज़र में काम नहीं किया, इसलिए मैंने अधिकतम लिया ... मैंने फिर कोशिश की और अनंतता 'बी' के '0' भाग' को 'NaN' – koffein

+0

में बदल देगी। त्रिभुज कार्यों के बारे में नहीं पता था, बहुत उपयोगी। –

संबंधित मुद्दे