2013-08-23 6 views
6

मैं जिसमें में एक शून्य मान होना सभी पंक्तियों को हटाने के लिए एक समारोह लिखने के लिए कोशिश कर रहा हूँ यह मेरा कोड से नहीं है, लेकिन विचार का एक उदाहरण मैं उपयोग कर रहा हूँ:।मैं एक numpy सरणी में एक पंक्ति कैसे हटा सकता हूं जिसमें शून्य है?

import numpy as np 
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0])) 
b=[] 

for i in range(len(a)): 
    for j in range (len(a[i])): 
     if a[i][j]==0: 
      b.append(i) 

print 'b=', b 
for zero_row in b: 
    x=np.delete(a,zero_row, 0) 

print 'a=',a 

और यह वह जगह है मेरा आउटपुट:

b= [1, 3] 
a= [[7 1 2 8] 
[4 0 3 2] 
[5 8 3 6] 
[4 3 2 0]] 

मैं बी में इंडेक्स के साथ पंक्तियों से कैसे छुटकारा पा सकता हूं? क्षमा करें, मैं इस बात के लिए बिल्कुल नया हूं कि वास्तव में सराहना की जाएगी।

+0

बस एक टिप्पणी। उदाहरण पंक्ति का वह टुकड़ा आपने व्यक्तिगत पंक्तियों को हटाने के लिए 'b' पर loops पोस्ट किया। इसकी बिल्कुल आवश्यकता नहीं है। 'a = np.delete (ए, बी, अक्ष = 0) 'एक आकर्षण की तरह काम करता है (' अक्ष 'जिसे हम और अधिक स्पष्ट करने के लिए निर्दिष्ट करते हैं) –

उत्तर

2

np.delete शामिल नहीं है परिवर्तन सरणी की तरह लग रहा है, बस एक नई सरणी देता है, तो

x = np.delete(a,zero_row, 0) 

के बजाय

a = np.delete(a,zero_row, 0) 
+0

आह जो बेवकूफ था, शायद सुबह की सुबह। हालांकि मैंने इसे बदल दिया और ** ValueError: अमान्य प्रविष्टि ** त्वरित प्रतिक्रिया –

1

कोशिश मुझे लगता है कि मैं इस सवाल का जवाब मिल गया है:

@tuxcanfly के रूप में कहा कि मैंने एक्स को बदल दिया है। इसके अलावा मैंने अब लूप को हटा दिया है क्योंकि इसे किसी कारण से इंडेक्स 2 के साथ पंक्ति हटा दी गई है।

इसके बजाय अब मैंने उस अनुक्रमणिका के साथ पंक्ति को हटाने के लिए सूची में तत्वों का उपयोग करने के साथ हटाए गए फ़ंक्शन के रूप में बी का उपयोग करके पंक्तियों को हटाने का चयन किया है।

नए कोड:

import numpy as np 
a=np.array(([7,1,2,8],[4,0,3,2],[5,8,3,6],[4,3,2,0])) 
b=[] 

for i in range(len(a)): 
    for j in range (len(a[i])): 
     if a[i][j]==0: 
      b.append(i) 
print 'b=',b 
for zero_row in b: 
    a=np.delete(a,b, 0) 

print 'a=',a 

और आउटपुट:

b= [1, 3] 
a= [[7 1 2 8] 
[5 8 3 6]] 
0

इस अति-चालाक एक छोटे से हो रही हो सकता है, लेकिन मैं यह पठनीयता में मदद करता है (और पाश करने के लिए आप एक बार की अनुमति देता है लगता है, दो बार नहीं):

#!/usr/bin/env python 

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

for i in a: 
    if not (0 in i): 
     try: 
      b = np.vstack((b, i)) 
     except NameError: 
      b = i 
a = b 
print 'a = ', a 

इस संस्करण में, आप प्रत्येक पंक्ति पर लूप करते हैं और पंक्ति में 0 की सदस्यता के लिए परीक्षण करते हैं। यदि पंक्ति में शून्य नहीं है, तो आप पंक्ति को एरे में पंक्ति जोड़ने के लिए np.vstack का उपयोग करने का प्रयास करते हैं। अब, बी शुरू करना अन्यथा मुश्किल हो सकता है, क्योंकि यह एक संख्या के रूप में तत्वों की एक ही संख्या के साथ एक numpy सरणी होना चाहिए, लेकिन दो बार लूप के बजाय और इसके लिए पहले मूल्य के लिए शिकार जाना, मैं बस एक कोशिश/छोड़ दिया उस मामले को पकड़ने के लिए जहां यह अस्तित्व में नहीं है और vstack का उपयोग करने के बजाय असाइन करें।

10

I'm trying to write a function to delete all rows in which have a zero value in.

आप उस के लिए एक समारोह लिखने के लिए की जरूरत नहीं है, यह एक एकल अभिव्यक्ति में किया जा सकता:

>>> a[np.all(a != 0, axis=1)] 
array([[7, 1, 2, 8], 
     [5, 8, 3, 6]]) 

पढ़ें के रूप में: a से चयन सभी पंक्तियां पूरी तरह से गैर शून्य हैं।

+0

के लिए धन्यवाद 1 डी सरणी के लिए ऐसा करने का कोई तरीका है? क्या आप अक्ष विनिर्देश छोड़ देंगे? अर्थात। ** बी [np.all (बी! = 0,)] ** जहां बी 1 डी सर –

+2

'बी = बी [बी! = 0]' '0' के' बी' में हटा देता है। इसे बूलियन इंडेक्सिंग कहा जाता है। –

+0

क्या होगा यदि कोई "2" वाले सभी कॉलम को हटाना चाहता है? 'a [np.all (a! = 2, axis = 0)]' अपेक्षित के रूप में काम नहीं करता है। मुझे इसके बजाय ट्रांसपोज़र में हेरफेर करना पड़ा। कोई उपाय? –

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