2016-12-26 2 views
9

मेरे पास दो त्रि-आयामी सरणी, ए और बी हैं, और उन तत्वों के साथ बी के 2 डी सबरेरे को ढूंढना चाहते हैं जहां न्यूनतम तीसरे अक्ष के साथ न्यूनतम था, यानीकिसी अन्य सरणी में धुरी के साथ न्यूनतम मानों के अनुरूप सरणी खोजें

a=n.random.rand(20).reshape((5,2,2)) 
b=n.arange(20).reshape((5,2,2)) 
c=n.argmin(a,2) #indices with minimal value of a 
d=n.zeros_like(c) #the array I want 
for i in range(5): 
    for j in range(2): 
    d[i,j] = b[i,j,c[i,j]] 

क्या कोई तरीका है कि मैं डबल लूप के बिना इन मानों को प्राप्त कर सकता हूं?

मैं इस जवाब के बारे में पता कर रहा हूँ: replace min value to another in numpy array लेकिन अगर मैं यह मेरी 3 डी सरणियों के लिए काम करना चाहता हूँ मैं संचालन देगी का एक बहुत कर दिया था - और अगर वहाँ सरल कुछ है मैं सोच रहा हूँ।

In [83]: x, y, z = a.shape 
In [84]: b[np.repeat(np.arange(x), y), np.tile(np.arange(y), x), c.ravel()].reshape(x, y) 

यहाँ np.repeat(np.arange(x), y) आप पहली बार अक्ष की इसी सूचकांक दे देंगे:

उत्तर

1

यहाँ का उपयोग कर fancy-indexing एक दृष्टिकोण है -

m,n,r = b.shape 
d_out = b[np.arange(m)[:,None],np.arange(n),c] 
1

यहाँ एक Numpythonic तरीका है।

In [86]: np.repeat(np.arange(x), y) 
Out[86]: array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4]) 

np.tile(np.arange(y), x) आप दूसरी धुरी के लिए इसी सूचकांक दे देंगे।

In [87]: np.tile(np.arange(y), x) 
Out[87]: array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1]) 

और तीसरा एक के लिए आप सिर्फ c की चपटी आकार का उपयोग कर सकते हैं।

In [88]: c.ravel() 
Out[88]: array([1, 0, 1, 1, 1, 0, 1, 1, 0, 0]) 
+0

करने के लिए (5,2) इन रुप और पुन परिणाम एक और उत्तर से की 'सुझाव ogrid'' mgrid' संस्करण की तरह दिखना चाहिए। – hpaulj

+0

@ hpaulj हां, दुर्भाग्य से मैं उस समारोह से परिचित नहीं था। – Kasramvd

3

आप अन्य आयामों के लिए एक ग्रिड बनाने के लिए np.ogrid उपयोग कर सकते हैं:

x, y, z = arr.shape # assuming your array is named "arr" 
xyz = np.ogrid[0:x, 0:y] + [c] # c is your second axis index (the argmin) 
arr[xyz] 

यदि यह पिछले अक्ष तो आप बस insert क्योंकि ogrid रिटर्न एक सामान्य अजगर सूचकांक युक्त सूची का उपयोग कर सकते है।

+0

बस जांचने के लिए: n.ogrid [0: x, 0: y] + [c] सी के तत्वों के साथ, ओग्रीड-सरणी में तीसरा आयाम जोड़ता है, सही? तो यह फैंसी-इंडेक्सिंग उत्तर के समान ही लगता है (जिसे मैंने स्वीकार किया है क्योंकि यह भी छोटा है, लेकिन यह दिलचस्प है - धन्यवाद!)। – mzzx

+0

@mzzx मूल रूप से समान उत्तर, दोनों डेटा सरणी में अनुक्रमणित करने के लिए प्रसारण श्रेणी सरणी बनाते हैं। अंतर केवल उन रेंज सरणी बनने के तरीके में है। मेरी पोस्ट प्रसारण को स्पष्ट रूप से करती है, जबकि यह पोस्ट इसे किसी फ़ंक्शन की सहायता से करता है। – Divakar

+0

@mzzx हाँ, वे बराबर हैं! यदि आप इसे छोटा पसंद करते हैं, तो आप इसे एक पंक्ति में भी लिख सकते हैं: arr [np.ogrid [0: arr.shape [0], 0: arr.shape [1]] + [c]] :-) – MSeifert

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