2012-06-20 35 views
6

Tôi có một mảng 800x800 và tôi muốn phân tích chỉ các phần tử trong phần outter của nó. Tôi cần một mảng mới mà không có các phần tử của slice [5: -5,5: -5]. Nó không nhất thiết phải trả về một mảng 2d, một mảng phẳng hoặc một danh sách sẽ làm như vậy. Ví dụ:Làm thế nào để loại bỏ một tập con mảng 2d?

import numpy 

>>> a = numpy.arange(1,10) 
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

>>> a.shape = (3,3) 
array([[1, 2, 3], 
    [4, 5, 6], 
    [7, 8, 9]]) 

tôi cần phải loại bỏ các yếu tố cốt lõi, cái gì đó như:

del a[1:2,1:2] 

Tôi hy vọng sẽ có:

array([1, 2, 3, 4, 6, 7, 8, 9]) 

Tôi cố gắng để sử dụng numpy.delete() nhưng nó dường như hoạt động với một trục tại một thời điểm. Tôi tự hỏi nếu có một cách thẳng tiến hơn để làm điều này.

Trả lời

2

Bạn có thể thay thế các khu vực trung với một số giá trị giữ chỗ (tôi đã sử dụng -12.345, bất cứ điều gì mà không thể xảy ra trong dữ liệu thực tế của bạn sẽ làm việc), sau đó chọn tất cả mọi thứ đó không phải là tương đương với giá trị:

>>> import numpy as np 
>>> a = np.arange(1,26) 
>>> a.shape = (5,5) 
>>> a 
array([[ 1, 2, 3, 4, 5], 
     [ 6, 7, 8, 9, 10], 
     [11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20], 
     [21, 22, 23, 24, 25]]) 

>>> a[1:4,1:4] = -12345 
>>> a 
array([[  1,  2,  3,  4,  5], 
     [  6, -12345, -12345, -12345,  10], 
     [ 11, -12345, -12345, -12345,  15], 
     [ 16, -12345, -12345, -12345,  20], 
     [ 21,  22,  23,  24,  25]]) 
>>> a[a != -12345] 
array([ 1, 2, 3, 4, 5, 6, 10, 11, 15, 16, 20, 21, 22, 23, 24, 25]) 

Nếu bạn sử dụng một mảng phao chứ không phải là một mảng số nguyên, bạn có thể làm điều đó tao nhã hơn một chút bằng cách sử dụng NaNisfinite:

>>> a = np.arange(1,26).astype('float32') 
>>> a.shape = (5,5) 
>>> a[1:4,1:4] = np.nan 
>>> a 
array([[ 1., 2., 3., 4., 5.], 
     [ 6., nan, nan, nan, 10.], 
     [ 11., nan, nan, nan, 15.], 
     [ 16., nan, nan, nan, 20.], 
     [ 21., 22., 23., 24., 25.]], dtype=float32) 
>>> a[np.isfinite(a)] 
array([ 1., 2., 3., 4., 5., 6., 10., 11., 15., 16., 20., 
    21., 22., 23., 24., 25.], dtype=float32) 
6

bạn có thể sử dụng một mảng boolean để chỉ số mảng của bạn bất kỳ cách nào bạn muốn. Bằng cách đó bạn không phải thay đổi bất kỳ giá trị nào trong mảng ban đầu của bạn nếu bạn không muốn. Dưới đây là một ví dụ đơn giản:

>>> import numpy as np 
>>> a = np.arange(1,10).reshape(3,3) 
>>> b = a.astype(bool) 
>>> b[1:2,1:2] = False 
>>> b 
array([[ True, True, True], 
     [ True, False, True], 
     [ True, True, True]], dtype=bool) 
>>> a[b] 
array([1, 2, 3, 4, 6, 7, 8, 9]) 
+0

lựa chọn tuyệt vời bởi vì tôi không phải thay đổi mảng ban de và không có cần phải biết nội dung của mảng – user1470350

+0

@ user1470350 - yeah, một cách tốt đẹp của mình để làm những việc :) – fraxel

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