2011-09-06 23 views
8

मान लीजिए मैंNumpy बहुआयामी सरणी टुकड़ा करने की क्रिया

x = numpy.arange(27).reshape((3, 3, 3)) 

अब के साथ एक 3x3x3 numpy सरणी को परिभाषित किया है, मैं x[:, 0, 1], जो array([ 1, 10, 19]) रिटर्न के साथ (0,1) प्रत्येक 3x3 subarray के तत्व से युक्त एक सरणी मिल सकती है। क्या होगा यदि मेरे पास एक tuple (m, n) है और एक tuple में संग्रहीत प्रत्येक subarray (0,1) के (एम, एन) तत्व को पुनर्प्राप्त करना चाहते हैं?

उदाहरण के लिए, मान लीजिए कि मेरे पास t = (0, 1) है। मैंने x[:, t] की कोशिश की, लेकिन इसका सही व्यवहार नहीं है - यह प्रत्येक उपन्यास की पंक्तियों 0 और 1 देता है। मुझे मिला सबसे सरल समाधान

x.transpose()[tuple(reversed(t))].transpose() 

लेकिन मुझे यकीन है कि एक बेहतर तरीका होना चाहिए। बेशक, इस मामले में, मैं x[:, t[0], t[1]] कर सकता था, लेकिन इसे उस मामले में सामान्यीकृत नहीं किया जा सकता है जहां मुझे नहीं पता कि x और t कितने आयाम हैं।

उत्तर

9

आप पहली बार सूचकांक टपल बना सकते हैं:

index = (numpy.s_[:],)+t 
x[index] 
+0

कूल, के लिए धन्यवाद: तो यहाँ एक slice वस्तु का उपयोग कर बराबर बात है मदद (आप भी, wim)। मुझे s_ और slice के लिए अधिक उदाहरण मिलते हैं [scipy] (http://www.scipy.org/Numpy_Example_List)। मुझे लगता है कि मैंने पहले उस सूची को देखा था, लेकिन कुछ भी नहीं देखा जो प्रासंगिक दिखता था। – James

4

HYRY समाधान सही है, लेकिन मैं हमेशा थोड़ा अजीब दिखने होने की numpy के r_, c_ और s_ सूचकांक चाल मिल गया है। काट करने के लिए एक तर्क स्टॉप स्थिति है

x[(slice(None),) + t] 

कि (यानी None उसी तरह से सब जिसका अर्थ है कि x[:]x[None:None] के बराबर है)

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