मुझे पता है कि उन्नत अनुक्रमण का उपयोग करके ऐसा करने का एक शानदार तरीका होना चाहिए, मैं इसे समझ नहीं सकता।

मान लीजिए मेरे पास (2,3,4) सरणी है

x = array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

और (4,) सरणी y = array([1,0,1,1])

(3,4) सरणी प्राप्त करने का सबसे सुंदर तरीका क्या है?

z = np.zeros((3,4))
for ii in xrange(3):
    for jj in xrange(4):
         z[ii,jj] = x[y[jj],ii,jj]

पैदा करता है?

0
Zen 26 मार्च 2020, 08:54

1 उत्तर

सबसे बढ़िया उत्तर
In [490]: x[y,:,np.arange(4)]                                                                  
Out[490]: 
array([[12, 16, 20],
       [ 1,  5,  9],
       [14, 18, 22],
       [15, 19, 23]])

हमें इसे स्थानांतरित करने की आवश्यकता है। बुनियादी और उन्नत अनुक्रमण के मिश्रण के साथ, स्लाइस आयाम को अंतिम रखा गया है:

In [491]: x[y,:,np.arange(4)].T                                                                
Out[491]: 
array([[12,  1, 14, 15],
       [16,  5, 18, 19],
       [20,  9, 22, 23]])

(वह मूल/उन्नत quirk कुछ SO में प्रलेखित और चर्चा की गई है।)

या चारों ओर उन्नत अनुक्रमण के साथ:

In [492]: x[y,np.arange(3)[:,None],np.arange(4)]                                               
Out[492]: 
array([[12,  1, 14, 15],
       [16,  5, 18, 19],
       [20,  9, 22, 23]])
1
hpaulj 26 मार्च 2020, 07:26