How do I delete a row in a numpy array which contains a zero? [duplicate]

本秂侑毒 提交于 2019-12-10 03:34:10

问题


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.


回答1:


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.




回答2:


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)



回答3:


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]]



回答4:


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.



来源:https://stackoverflow.com/questions/18397805/how-do-i-delete-a-row-in-a-numpy-array-which-contains-a-zero

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!