2012-01-05 14 views
5

मान लें कि मेरे पास आकार n x m x k ​​का एक numpy array ए है और आकार n x m का एक और सरणी बी है जिसमें 1 से k के सूचकांक हैं। मैं बी, में इस स्थान पर दिए गए इंडेक्स का उपयोग करके ए के प्रत्येक एन एक्स एम स्लाइस को एक्सेस करना चाहता हूं, मुझे आकार एन एक्स मीटर की एक सरणी दे रही है।कई आयामों में बेवकूफ फैंसी इंडेक्सिंग

संपादित करें: यह स्पष्ट रूप से नहीं है कि मैं क्या चाहता हूं! [[मैं इस take इस तरह का उपयोग कर प्राप्त कर सकते हैं:

A.take(B) ]] अंत संपादित

इस कल्पना अनुक्रमण का प्रयोग कर प्राप्त किया जा सकता है? मैंने सोचा होगा कि A[B] एक ही परिणाम देगा, लेकिन परिणाम आकार n x m x m x k ​​(जिसे मैं वास्तव में समझ में नहीं आता) की एक सरणी में परिणाम देता हूं।

कारण मैं उपयोग करने के लिए take है कि मैं इस भाग कुछ प्रदान करने में सक्षम होना चाहता हूँ नहीं करना चाहते, जैसे

A[B] = 1

केवल काम कर समाधान मैं अब तक है कि है

A.reshape(-1, k)[np.arange(n * m), B.ravel()].reshape(n, m)

लेकिन निश्चित रूप से एक आसान तरीका होना चाहिए?

उत्तर

3

मान लीजिए

import numpy as np 
np.random.seed(0) 

n,m,k = 2,3,5 
A = np.arange(n*m*k,0,-1).reshape((n,m,k)) 
print(A) 
# [[[30 29 28 27 26] 
# [25 24 23 22 21] 
# [20 19 18 17 16]] 

# [[15 14 13 12 11] 
# [10 9 8 7 6] 
# [ 5 4 3 2 1]]] 

B = np.random.randint(k, size=(n,m)) 
print(B) 
# [[4 0 3] 
# [3 3 1]] 

इस सरणी बनाने के लिए,

print(A.reshape(-1, k)[np.arange(n * m), B.ravel()]) 
# [26 25 17 12 7 4] 

एक nxm सरणी का उपयोग कर कल्पना अनुक्रमण के रूप में:

i,j = np.ogrid[0:n, 0:m] 
print(A[i, j, B]) 
# [[26 25 17] 
# [12 7 4]] 
+0

दूसरे से एक है। ऐसा लगता है कि मैंने गलत समझा (या गलत अक्ष के साथ इसे लिया)। स्पष्टीकरण के लिए धन्यवाद। –

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