9

I'm trying to write a function to delete all rows in which have a zero value in. This is not from my code, but an example of the idea I am using:

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

and this is my output:

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

How do I get rid of the rows with the index in b? Sorry, I'm fairly new to this any help would be really appreciated.

Ashleigh Clayton
  • 1,443
  • 8
  • 23
  • 32
  • Just one comment. That piece of example code you posted loops over `b` to delete individual rows. That's not needed at all. `a = np.delete(a, b, axis=0)` works like a charm (`axis` specified to make it more evident what we're doing) – Ricardo Cárdenes Feb 06 '14 at 11:24

4 Answers4

16

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

You don't need to write a function for that, it can be done in a single expression:

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

Read as: select from a all rows that are entirely non-zero.

Fred Foo
  • 355,277
  • 75
  • 744
  • 836
3

Looks like np.delete does't change the array, just returns a new array, so

Instead of

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

try

a = np.delete(a,zero_row, 0)
tuxcanfly
  • 2,494
  • 1
  • 20
  • 18
  • ah that was stupid, probably to early in the morning. However I did change this and got **ValueError:invalid entry** thanks for the quick response – Ashleigh Clayton Aug 23 '13 at 08:12
1

I think I have found the answer:

as @tuxcanfly said I changed x to a. Also I have now removed the for loop as it removed the row with index 2 for some reason.

Instead I now just chose to delete the rows using b as the delete function with use the elements in the list to remove the row with that index.

the new code:

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

and the output:

b= [1, 3]
a= [[7 1 2 8]
 [5 8 3 6]]
Ashleigh Clayton
  • 1,443
  • 8
  • 23
  • 32
1

I think this helps readability (and allows you to loop once, not twice):

#!/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]))
b = None

for row in a:
    if 0 not in row:
        b = np.vstack((b, row)) if b is not None else row

a = b
print 'a = ', a

In this version, you loop over each row and test for 0's membership in the row. If the row does not contain a zero, you attempt to use np.vstack to append the row to an array called b. If b has not yet been assigned to, it is initialized to the current row.

Community
  • 1
  • 1
Mark R. Wilkins
  • 1,282
  • 7
  • 15