2015-11-16 8 views
5

जूलिया में, एक वेक्टर को पुनर्प्राप्त करने का कोई तरीका है जिसमें बहु-आयामी सरणी से कई तत्व शामिल हैं जो numpy के उन्नत अनुक्रमण के समान हैं?जूलिया सरणी से कई चयन

genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3) 
genconv[[1,2,3],[2,3,1]] 

यह एक 3x3 सरणी में परिणाम एक वेक्टर में नहीं: इस 2 डी सरणी से उदाहरण के लिए screen shot

+0

नहीं पसंद है? '[genconv [[1,2,3], [2,3,1]] ...]' –

+0

नहीं, क्योंकि मैं तीन तत्वों के साथ एक वेक्टर की उम्मीद कर रहा हूं। –

उत्तर

5

col और row सूचकांक द्वारा तत्वों एक तरह से प्राप्त करने के लिए उपयोग करने के लिए है sub2ind समारोह:

getindex(genconv,sub2ind(size(genconv),[1,2,3],[2,3,1]))

संपादित

के रूप में पहले से ही @ user3580870 टिप्पणी की है

getindex(genconv,sub2ind(size(genconv),[1,2,3],[2,3,1])) के बराबर होती है genconv[sub2ind(size(genconv),[1,2,3],[2,3,1])]

क्या मैं शो getindex और सरणी comprehensions वाक्य रचना के बीच दक्षता में कोई अंतर नहीं मिला है।

+2

a.k.a. 'genconv [sub2ind (आकार (genconv), [1,2,3], [2,3,1])]' –

+0

कूल, काम करता है! पायथन/आर से आ रहा है यह अप्रत्याशित रूप से जटिल लग रहा है। अगर मुझे अच्छा प्रदर्शन की ज़रूरत है तो क्या यह एक अच्छा विकल्प है? –

+3

ज़िप [[1,2,3], [2,3,1])] में [[genconv [i, j] के लिए (i, j) के बारे में क्या है? यह थोड़ा और प्रत्यक्ष लगता है। – jverzani

2

एक अन्य विकल्प बस नहीं बल्कि एक बहुआयामी सरणी से, वेक्टर के रूप में डेटा के इलाज के लिए है:

genconv = [6,9,7,1,4,2,3,2,0,9,10,8,7,8,5] 

genconv[ [10, 13] ] 
4

जूलिया 0.5 अब CartesianIndex तों की सरणियों द्वारा अनुक्रमण का समर्थन करता है।

julia> genconv[[CartesianIndex(1,2),CartesianIndex(2,3),CartesianIndex(3,1)]] 
3-element Array{Int64,1}: 
2 
8 
7 

यह सुंदर वर्बोज़ है और:

julia> genconv = reshape([6,9,7,1,4,2,3,2,0,9,10,8,7,8,5], 5, 3) 
5×3 Array{Int64,2}: 
6 2 10 
9 3 8 
7 2 7 
1 0 8 
4 9 5 

julia> genconv[CartesianIndex(2,3)] # == genconv[2,3] 
8 

दिलचस्प बात यह है कि आप इस numpy शैली pointwise अनुक्रमण निर्दिष्ट करने के लिए CartesianIndex तों की वैक्टर का उपयोग कर सकते है: एक CartesianIndex एक विशेष सूचकांक प्रकार कई आयामों तक फैला है कि है भयानक दिखने वाला, लेकिन इसे बहुत अच्छे समाधान के लिए नए f.() विशेष प्रसारण वाक्यविन्यास के साथ जोड़ा जा सकता है:

julia> genconv[CartesianIndex.([1,2,3],[2,3,1])] 
3-element Array{Int64,1}: 
2 
8 
7