मैं मैट्रिक्स के तत्व की 1-डी अनुक्रमणिका कैसे प्राप्त करूं?

उदाहरण के लिए:

b=np.array([1, 2, 3, 4, 5, 6])
c = b.reshape(2,3,order='F')#colmaj
d = b.reshape(2,3)#rowmaj

यह ग है:

([[1, 3, 5],
 [2, 4, 6]])

यह घ है:

([[1, 2, 3],
 [4, 5, 6]])

अगर मैं सी [1,2] करता हूं तो मुझे तत्व 6 मिलता है, और मुझे 1-डी सरणी की अनुक्रमणिका प्राप्त करने की आवश्यकता होती है जो 5 होगी। मैं इसे मानसिक रूप से कर सकता हूं लेकिन अगर मेरे पास एक बड़ा मैट्रिक्स है और मुझे एक का चयन करने की आवश्यकता है यादृच्छिक रूप से तत्व मैं नहीं कर पाऊंगा। मुझे colmajor और rowmajor मेट्रिसेस दोनों के लिए ऐसा करने के लिए फंक्शन लिखने की जरूरत है।

def linearize_colmajor(i, j, m, n):        
        """
        Returns the linear index for the `(i, j)` entry of
        an `m`-by-`n` matrix stored in column-major order.
        """
1
zelda1234 28 फरवरी 2019, 22:15

2 जवाब

सबसे बढ़िया उत्तर

बस पंक्ति अनुक्रमणिका को स्तंभों की संख्या से मापें और पंक्ति-प्रमुख क्रम के लिए स्तंभ अनुक्रमणिका जोड़ें। कॉलम-मेजर ऑर्डर के लिए, रो-इंडेक्स को स्केल करने के लिए पंक्तियों की संख्या का उपयोग करें और कॉलम इंडेक्स को फिर से जोड़ें।

इसलिए, rowmaj संस्करण के लिए चपटा सूचकांक प्राप्त करने के लिए -

i*n+j

colmaj संस्करण के लिए चपटा सूचकांक प्राप्त करने के लिए -

i*m+j

कहां :

i = row index
j = col index
m = number of rows in the matrix
n = number of columns in the matrix

फंक्शन फॉर्मेट में लाना -

def linearize(i, j, m, n, order='C'):
    if order=='C': # rowmaj
        return i*n+j
    elif order=='F': # colmaj
        return i*m+j
    else:
        raise Exception("Invalid order value")

सैंपल रन -

In [42]: linearize(i=1, j=1, m=2, n=3, order='C')
Out[42]: 4 # element : 5 in rowmaj array, d

In [43]: linearize(i=1, j=1, m=2, n=3, order='F')
Out[43]: 3 # element : 4 in colmaj array, c
1
Divakar 28 फरवरी 2019, 22:40

np.ravel_multi_index निर्दिष्ट करने के विकल्प के साथ n-d इंडेक्स को एक फ्लैट में कनवर्ट करता है order:

In [152]: np.ravel_multi_index((0,2),(2,3),order='C')                           
Out[152]: 2
In [153]: c[0,2], c.flat[2]                                                     
Out[153]: (5, 5)

order='F' मामले में आवेदन करना थोड़ा पेचीदा है:

In [154]: np.ravel_multi_index([0,2],[2,3],order='F')                           
Out[154]: 4
In [155]: d[0,2], d.flat[4], d.ravel(order='F')[4]                              
Out[155]: (3, 5, 3)
In [156]: d.ravel()                                                             
Out[156]: array([1, 2, 3, 4, 5, 6])
In [157]: d.ravel(order='F')                                                    
Out[157]: array([1, 4, 2, 5, 3, 6])

[1,2] तत्व दोनों क्रमों में समान है, अंतिम '6'।

@ दिवाकर के उदाहरण के साथ तुलना करें:

In [160]: np.ravel_multi_index([1,1],[2,3],order='C')                           
Out[160]: 4
In [161]: np.ravel_multi_index([1,1],[2,3],order='F')                           
Out[161]: 3
0
hpaulj 28 फरवरी 2019, 22:36