2009-10-29 48 views
35

Tôi muốn xóa các cột đã chọn trong một numpy.array. Đây là những gì tôi làm:Làm thế nào để xóa các cột trong numpy.array

n [397]: a = array([[ NaN, 2., 3., NaN], 
    .....:  [ 1., 2., 3., 9]]) 

In [398]: print a 
[[ NaN 2. 3. NaN] 
[ 1. 2. 3. 9.]] 

In [399]: z = any(isnan(a), axis=0) 

In [400]: print z 
[ True False False True] 

In [401]: delete(a, z, axis = 1) 
Out[401]: 
array([[ 3., NaN], 
     [ 3., 9.]]) 

Trong ví dụ này, mục tiêu của tôi là xóa tất cả các cột chứa NaN. Tôi hy vọng lệnh cuối cùng sẽ dẫn đến:

array([[2., 3.], 
     [2., 3.]]) 

Làm cách nào tôi có thể làm điều đó?

Trả lời

48

Với tên gọi của nó, tôi nghĩ rằng cách tiêu chuẩn nên delete:

import numpy as np 

A = np.delete(A, 1, 0) # delete second row of A 
B = np.delete(B, 2, 0) # delete third row of B 
C = np.delete(C, 1, 1) # delete second column of C 
+12

Tôi tin rằng bạn nên tham khảo 'numpy', không phải 'scipy'. http://docs.scipy.org/doc/numpy/reference/generated/numpy.delete.html – hlin117

7

Điều này tạo ra một mảng mà không cần các cột:

b = a.compress(logical_not(z), axis=1) 
+2

. Tôi muốn cú pháp của MATLAB làm việc ở đây: "a (:, z) = []" đơn giản hơn nhiều –

+1

tương tự: b = a [:, [1,2]] – Paul

+1

@ bpowah: thực sự. cách tổng quát hơn sẽ là b = a [:, z]. Bạn có thể muốn cập nhật câu trả lời của bạn cho phù hợp –

12

Một cách khác là sử dụng mảng đeo mặt nạ:

import numpy as np 
a = np.array([[ np.nan, 2., 3., np.nan], [ 1., 2., 3., 9]]) 
print(a) 
# [[ NaN 2. 3. NaN] 
# [ 1. 2. 3. 9.]] 

Phương pháp np.ma.masked_invalid trả về một mảng đeo mặt nạ với Nans và INFs đeo mặt nạ ra:

print(np.ma.masked_invalid(a)) 
[[-- 2.0 3.0 --] 
[1.0 2.0 3.0 9.0]] 

Phương thức np.ma.compress_cols trả về mảng 2-D có cột bất kỳ ing một giá trị đeo mặt nạ đàn áp:

a=np.ma.compress_cols(np.ma.masked_invalid(a)) 
print(a) 
# [[ 2. 3.] 
# [ 2. 3.]] 

Xem manipulating-a-maskedarray

7

Ví dụ từ the numpy documentation:

>>> a = numpy.array([[ 0, 1, 2, 3], 
       [ 4, 5, 6, 7], 
       [ 8, 9, 10, 11], 
       [12, 13, 14, 15]]) 

>>> numpy.delete(a, numpy.s_[1:3], axis=0)      # remove rows 1 and 2 

array([[ 0, 1, 2, 3], 
     [12, 13, 14, 15]]) 

>>> numpy.delete(a, numpy.s_[1:3], axis=1)      # remove columns 1 and 2 

array([[ 0, 3], 
     [ 4, 7], 
     [ 8, 11], 
     [12, 15]]) 
+2

Có gì 's_' ???? – alvas

+0

@alvas đây là giải thích được tổ chức tốt! http://stackoverflow.com/questions/32682754/np-delete-and-np-s-whats-so-special-about-np-s –

2

Trong trường hợp của bạn, bạn có thể trích xuất các dữ liệu mong muốn với:

a[:, -z] 

"-z" là phủ định logic của mảng boolean "z". Đây là giống như:

a[:, logical_not(z)] 
5

Từ Numpy Documentation

np.delete (arr, obj, trục = Không) Return một mảng mới với phụ mảng dọc theo một trục bị xóa.

>>> arr 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12]]) 
>>> np.delete(arr, 1, 0) 
array([[ 1, 2, 3, 4], 
     [ 9, 10, 11, 12]]) 

>>> np.delete(arr, np.s_[::2], 1) 
array([[ 2, 4], 
     [ 6, 8], 
     [10, 12]]) 
>>> np.delete(arr, [1,3,5], None) 
array([ 1, 3, 5, 7, 8, 9, 10, 11, 12]) 
1
>>> A = array([[ 1, 2, 3, 4], 
       [ 5, 6, 7, 8], 
       [ 9, 10, 11, 12]]) 

>>> A = A.transpose() 

>>> A = A[1:].transpose() 
0

Remove các cột Matrix có chứa NaN. Đây là câu trả lời dài, nhưng hy vọng dễ làm theo.

def column_to_vector(matrix, i): 
    return [row[i] for row in matrix] 
import numpy 
def remove_NaN_columns(matrix): 
    import scipy 
    import math 
    from numpy import column_stack, vstack 

    columns = A.shape[1] 
    #print("columns", columns) 
    result = [] 
    skip_column = True 
    for column in range(0, columns): 
     vector = column_to_vector(A, column) 
     skip_column = False 
     for value in vector: 
      # print(column, vector, value, math.isnan(value)) 
      if math.isnan(value): 
       skip_column = True 
     if skip_column == False: 
      result.append(vector) 
    return column_stack(result) 

### test it 
A = vstack(([ float('NaN'), 2., 3., float('NaN')], [ 1., 2., 3., 9])) 
print("A shape", A.shape, "\n", A) 
B = remove_NaN_columns(A) 
print("B shape", B.shape, "\n", B) 

A shape (2, 4) 
[[ nan 2. 3. nan] 
[ 1. 2. 3. 9.]] 
B shape (2, 2) 
[[ 2. 3.] 
[ 2. 3.]] 
+0

Tôi thực sự không theo bạn. Mã này hoạt động như thế nào? – RamenChef

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