2009-05-24 14 views

उत्तर

112

क्या यह हो सकता है कि आप NumPy array का उपयोग कर रहे हों? पायथन में array मॉड्यूल है, लेकिन यह बहु-आयामी सरणी का समर्थन नहीं करता है। सामान्य पायथन सूची एकल-आयामी भी हैं।

हालांकि, अगर आप इस तरह की एक सरल दो आयामी सूची है:

def column(matrix, i): 
    return [row[i] for row in matrix] 

दूसरे स्तंभ निकाला जा रहा है (सूचकांक 1):

A = [[1,2,3,4], 
    [5,6,7,8]] 

तो आप इस प्रकार का स्तंभ निकाल सकते हैं:

>>> column(A, 1) 
[2, 6] 

या वैकल्पिक रूप से, बस:

>>> [row[1] for row in A] 
[2, 6] 
8

आइटमेटटर ऑपरेटर भी मदद कर सकता है, अगर आप छोटी समझ के लिए सूची समझ के बजाय नक्शा-शैली शैली पाइथन पसंद करते हैं!

# tested in 2.4 
from operator import itemgetter 
def column(matrix,i): 
    f = itemgetter(i) 
    return map(f,matrix) 

M = [range(x,x+5) for x in range(10)] 
assert column(M,1) == range(1,11) 
+1

उपयोग itertools.imap बड़े डेटा के लिए –

+0

itemgetter दृष्टिकोण दौड़ा अपने प्रयोग के मामले के लिए सूची समझ दृष्टिकोण से के बारे में 50x तेजी से। पायथन 2.7।2, केस का उपयोग कुछ सौ पंक्तियों और स्तंभों के साथ एक मैट्रिक्स पर कई पुनरावृत्तियों था। – joelpt

130
>>> import numpy as np 
>>> A = np.array([[1,2,3,4],[5,6,7,8]]) 

>>> A 
array([[1, 2, 3, 4], 
    [5, 6, 7, 8]]) 

>>> A[:,2] # returns the third columm 
array([3, 7]) 

भी देखें: "numpy.arange" और "नयी आकृति प्रदान" स्मृति को आबंटित करने

उदाहरण:

nrows = 3 
ncols = 4 
my_array = numpy.arange(nrows*ncols, dtype='double') 
my_array = my_array.reshape(nrows, ncols) 
+1

मुझे खोजने के लिए 2 घंटे लग गए [:, 2] अनुमान लगाएं कि इस सुविधा का आकलन आधिकारिक साहित्य में नहीं है? – sloven

+0

अल्पविराम का क्या अर्थ है? – Phil

+0

@ फिल '[पंक्ति, कॉल] '। अल्पविराम अलग करता है। – AsheKetchum

49

(मैट्रिक्स के आकार देने (3x4) के साथ एक सरणी का आवंटन) यदि आपके पास

a = [[1, 2], [2, 3], [3, 4]] 

था जैसे सरणी है एन आप ऐसा पहले कॉलम निकालें:

[row[0] for row in a] 

तो परिणाम इस प्रकार है:

[1, 2, 3] 
23

अभी देखें!

a = [[1, 2], [2, 3], [3, 4]] 
a2 = zip(*a) 
a2[0] 

यह छोड़कर किसी भी तरह यह neater जिप काम करता है, लेकिन तर्क के रूप में एकल सरणियों की आवश्यकता है, जैसा कि ऊपर एक ही बात है, * एक वाक्य रचना एकल सरणी तर्क

+5

ऊपर क्या है? याद रखें कि उत्तरों हमेशा एक ही तरह से क्रमबद्ध नहीं होते हैं। – Muhd

+2

यह साफ़ है, लेकिन यदि प्रदर्शन चिंता का विषय है तो यह सबसे कुशल नहीं हो सकता है, क्योंकि यह पूरे मैट्रिक्स को स्थानांतरित कर रहा है। – IceArdor

+2

एफवाईआई, यह अजगर 2 में काम करता है, लेकिन पायथन 3 में आपको जनरेटर ऑब्जेक्ट मिलेगा, जो कि सब्सक्राइब नहीं है। –

1

का उपयोग कर के बावजूद में बहुआयामी सरणी unpacks में

map(None, *[(1,2,3,), (4,5,), (6,)]) 

परिणाम::

एक नेस्टेड सूची स्थानांतरित करने के लिए, आप निम्न अगर नीडिंत सूचियों लंबाई में भिन्नता का उपयोग कर सकते
[(1, 4, 6), (2, 5, None), (3, None, None)] 

पहले कॉलम इस प्रकार है:

map(None, *[(1,2,3,), (4,5,), (6,)])[0] 
#>(1, 4, 6) 
2

खैर एक 'सा' देर हो गई ...

प्रदर्शन मामलों और आपके डेटा आयताकार आकार के मामले में, आप इसे एक आयाम में भी स्टोर कर सकते हैं और नियमित स्लाइसिंग द्वारा कॉलम तक पहुंच सकते हैं उदा। ...

A = [[1,2,3,4],[5,6,7,8]]  #< assume this 4x2-matrix 
B = reduce(operator.add, A) #< get it one-dimensional 

def column1d(matrix, dimX, colIdx): 
    return matrix[colIdx::dimX] 

def row1d(matrix, dimX, rowIdx): 
    return matrix[rowIdx:rowIdx+dimX] 

>>> column1d(B, 4, 1) 
[2, 6] 
>>> row1d(B, 4, 1) 
[2, 3, 4, 5] 

साफ बात यह वास्तव में तेज़ है। हालांकि, नकारात्मक सूचकांक यहां काम नहीं करते हैं! तो आप इंडेक्स -1 द्वारा अंतिम कॉलम या पंक्ति तक नहीं पहुंच सकते हैं।

यदि आपको नकारात्मक अनुक्रमण की आवश्यकता है तो आप एक्सेसर-फ़ंक्शंस को थोड़ा सा ट्यून कर सकते हैं, उदा।

def column1d(matrix, dimX, colIdx): 
    return matrix[colIdx % dimX::dimX] 

def row1d(matrix, dimX, dimY, rowIdx): 
    rowIdx = (rowIdx % dimY) * dimX 
    return matrix[rowIdx:rowIdx+dimX] 
+0

मैंने इस विधि की जांच की और कॉलम को पुनर्प्राप्त करने की लागत लूप के लिए नेस्टेड से सस्ता है। हालांकि, 1 डी मैट्रिक्स को 1 डी तक कम करना महंगा है यदि मैट्रिक्स बड़ा है, तो 1000 * 1000 कहें। –

3

एक और तरीका का उपयोग कर मैट्रिक्स

>>> from numpy import matrix 
>>> a = [ [1,2,3],[4,5,6],[7,8,9] ] 
>>> matrix(a).transpose()[1].getA()[0] 
array([2, 5, 8]) 
>>> matrix(a).transpose()[0].getA()[0] 
array([1, 4, 7]) 
0

एक नई सूची में एक मैट्रिक्स से सभी स्तंभों:

N = len(matrix) 
column_list = [ [matrix[row][column] for row in range(N)] for column in range(N) ] 
5

साथ ही आप इस का उपयोग कर सकते हैं:

values = np.array([[1,2,3],[4,5,6]]) 
values[...,0] # first column 
#[1,4] 

नोट: यह अंतर्निहित सरणी के लिए काम नहीं कर रहा है और गठबंधन नहीं है (उदा। np.array ([[1,2,3], [4,5,6,7]]))

6

मुझे लगता है कि आप इस तरह के

import numpy as np 
A = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) 
नीचे एक सरणी के रूप में एक सरणी से एक स्तंभ निकालना चाहते हैं अब आप पहली सरणी एक मैट्रिक्स

B=np.asmatrix(A) 
C=B[:,2] 
D=asarray(C) 

बनाने की जरूरत है प्रारूप में

D=array[[3], 
[7], 
[11]] 

फिर तीसरे स्तंभ प्राप्त करना चाहते हैं और अब आप बुद्धिमान तत्व कर सकते हैं अगर

एक्सेल में आप की तरह गणना करेंगे।

+1

हालांकि इससे मुझे बहुत मदद मिली, मुझे लगता है कि उत्तर बहुत छोटा हो सकता है: 1. ए = एनपी.एरे ([[1,2,3,4], [5,6,7,8], [9, 10,11,12]]) 2. ए [:, 1] >> सरणी ([2, 6, 10]) – Ufos

3

मान लीजिए कि हम n X m मैट्रिक्स (n पंक्तियों और m कॉलम) का कहना है कि 5 पंक्तियों और 4 कॉलम

matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16],[17,18,19,20]] 

अजगर में स्तंभों को निकालने के लिए, हमें इस

[ [row[i] for row in matrix] for in range(4) ] 
की तरह सूची समझ उपयोग कर सकते हैं करते हैं

आप अपने मैट्रिक्स के किसी भी कॉलम द्वारा 4 को प्रतिस्थापित कर सकते हैं। परिणाम

[ [1,5,9,13,17],[2,10,14,18],[3,7,11,15,19],[4,8,12,16,20] ]

अजगर में
3
def get_col(arr, col): 
    return map(lambda x : x[col], arr) 

a = [[1,2,3,4], [5,6,7,8], [9,10,11,12],[13,14,15,16]] 

print get_col(a, 3) 

नक्शा समारोह में जाने के लिए एक और तरीका है।

0

आप को केवल एक कॉलम की तुलना में अधिक आकर्षित करने के लिए चाहते हैं, बस टुकड़ा का उपयोग करें:

a = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) 
    print(a[:, [1, 2]]) 
[[2 3] 
[5 6] 
[8 9]] 
संबंधित मुद्दे