2013-08-23 29 views
6

Tôi đang cố gắng để viết một chức năng để xóa tất cả các hàng, trong đó có một giá trị zero trong Đây không phải là từ mã của tôi, nhưng một ví dụ về ý tưởng Tôi đang sử dụng:.Làm cách nào để xóa một hàng trong một mảng có chứa số không?

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 

và đây là đầu ra của tôi:

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

Làm cách nào để loại bỏ các hàng có chỉ mục trong b? Xin lỗi, tôi khá mới với sự trợ giúp này sẽ được thực sự đánh giá cao.

+0

Chỉ một nhận xét. Đó là đoạn mã ví dụ bạn đã đăng các vòng lặp trên 'b' để xóa các hàng riêng lẻ. Điều đó không cần thiết chút nào. 'a = np.delete (a, b, axis = 0)' hoạt động như một nét duyên dáng ('trục' được chỉ định để làm cho nó hiển nhiên hơn những gì chúng ta đang làm) –

Trả lời

2

Hình như np.delete thay đổi does't mảng, chỉ cần trả về một mảng mới, vì vậy

Thay vì

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

thử

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

ah ngu ngốc, có thể là vào sáng sớm. Tuy nhiên tôi đã thay đổi điều này và có ** ValueError: mục nhập không hợp lệ ** cảm ơn vì phản hồi nhanh –

1

Tôi nghĩ rằng tôi đã tìm thấy câu trả lời:

dưới dạng @tuxcanfly cho biết tôi đã thay đổi x thành a. Ngoài ra tôi đã loại bỏ vòng lặp for vì nó đã xóa hàng có chỉ số 2 vì một lý do nào đó. Thay vào đó, bây giờ tôi chỉ chọn xóa các hàng bằng cách sử dụng b làm hàm xóa với sử dụng các phần tử trong danh sách để loại bỏ hàng với chỉ mục đó.

mã mới:

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 

và đầu ra:

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

này có thể nhận được một chút quá thông minh, nhưng tôi nghĩ rằng nó giúp dễ đọc (và cho phép bạn để lặp một lần, không hai lần):

#!/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 

Trong phiên bản này, bạn lặp qua mỗi hàng và kiểm tra thành viên của 0 trong hàng. Nếu hàng không chứa số không, bạn cố gắng sử dụng np.vstack để nối hàng vào một mảng được gọi là b. Bây giờ, việc khởi tạo b có thể phức tạp hơn, bởi vì nó phải là một mảng numpy với cùng số phần tử như một hàng của một, nhưng thay vì lặp lại hai lần và đi săn tìm giá trị đầu tiên, tôi chỉ dùng thử/trừ để nắm bắt trường hợp nó không tồn tại và chỉ định thay vì sử dụng vstack.

10

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

Bạn không cần phải viết một chức năng cho rằng, nó có thể được thực hiện trong một biểu thức duy nhất:

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

đọc như: lựa chọn tuyệt vời a tất cả các hàng đó hoàn toàn khác không.

+0

có cách nào để thực hiện điều này cho mảng 1D không? bạn chỉ cần bỏ qua đặc tả trục? I E. ** b [np.all (b! = 0,)] ** trong đó b là mảng 1d –

+2

'b = b [b! = 0]' xóa '0' trong' b'. Nó được gọi là lập chỉ mục boolean. –

+0

Điều gì sẽ xảy ra nếu bạn muốn xóa tất cả các cột có chứa "2"? 'a [np.all (a! = 2, axis = 0)]' không hoạt động như mong đợi. Tôi đã phải sử dụng để thao túng chuyển vị thay thế. Bất kì lời đề nghị nào? –

Các vấn đề liên quan