2015-04-02 16 views
5

Tôi có dữ liệu trong một mảng NumPy:Làm cách nào để thay đổi định dạng gọn gàng hoạt động?

a = np.arange(100) 
a = a.reshape((20,5)) 

Khi tôi gõ

a[:10] 

nó trả

array([[ 0, 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, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49]]) 

Bây giờ tôi đã quyết định thay đổi hình dáng mảng vào mảng 3d.

b = a.reshape((5,4,5)) 

array([[[ 0, 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, 26, 27, 28, 29], 
    [30, 31, 32, 33, 34], 
    [35, 36, 37, 38, 39]], 

    [[40, 41, 42, 43, 44], 
    [45, 46, 47, 48, 49], 
    [50, 51, 52, 53, 54], 
    [55, 56, 57, 58, 59]], 

    [[60, 61, 62, 63, 64], 
    [65, 66, 67, 68, 69], 
    [70, 71, 72, 73, 74], 
    [75, 76, 77, 78, 79]], 

    [[80, 81, 82, 83, 84], 
    [85, 86, 87, 88, 89], 
    [90, 91, 92, 93, 94], 
    [95, 96, 97, 98, 99]]]) 

Làm cách nào để cắt b để tôi nhận được các giá trị như [: 10]? Tôi đã thử

b[:10,0,:5] 
array([[ 0, 1, 2, 3, 4], 
     [10, 11, 12, 13, 14], 
     [20, 21, 22, 23, 24], 
     [30, 31, 32, 33, 34], 
     [40, 41, 42, 43, 44], 
     [50, 51, 52, 53, 54], 
     [60, 61, 62, 63, 64], 
     [70, 71, 72, 73, 74], 
     [80, 81, 82, 83, 84], 
     [90, 91, 92, 93, 94]]) 

Nhưng không chính xác. Cảm ơn bạn trước!

+0

Bạn muốn một ma trận có 10 hàng có số từ 0 đến 50? nhưng đó là những gì định hình lại là ... b.reshape ((20,5)) [: 10] –

+0

Bạn có chắc chắn 'b' trông như thế này không? Tôi nhận được một cái gì đó khác nhau ... Tôi nghĩ rằng bạn có thay vì 'b = a.reshape (10,2,5)' – plonser

+0

'b' trông giống như một' (10,2,5) 'reshape – hpaulj

Trả lời

6

Khi bạn sử dụng b = a.reshape((5,4,5)) bạn chỉ cần tạo một chế độ xem khác trên cùng một dữ liệu được sử dụng bởi mảng a. (tức là thay đổi thành phần của a sẽ xuất hiện trong b). reshape() không sao chép dữ liệu trong trường hợp này, vì vậy nó hoạt động rất nhanh. Cắt b và cắt a truy cập cùng một bộ nhớ, vì vậy không cần bất kỳ cú pháp nào khác cho một mảng b (chỉ cần sử dụng a[:10]). Nếu bạn đã tạo bản sao dữ liệu, có lẽ với np.resize() và bị hủy a, chỉ cần định lại lại b: b.reshape((20,5))[:10].

+0

Không có cách nào để cắt b để nhận được [: 10]? – dnth

+1

Mảng 'b' của bạn được chia thành 5 khối 4 hàng, 5 cột. Bạn muốn tất cả các mục từ 2 khối đầu tiên và 2 hàng đầu tiên từ thứ ba. Tôi không nghĩ rằng có một cách đơn giản để cắt điều này để có được một mảng 10x5 duy nhất mà không định hình lại. Theo nghĩa nào đó, việc định hình lại chỉ thay đổi cách bạn lập chỉ mục bộ nhớ, do đó, đối với trường hợp của bạn, đó là một công cụ phụ để cắt theo cách bạn muốn. Nó không chậm. – xnx

2

Bằng cách định lại lại (20,5) đến (5,4,5), bạn không thể rút nửa số giá trị đầu tiên ra sao. Bạn không thể chia những 5 hàng vào 2 thậm chí nhóm:

In [9]: b[:2] 
Out[9]: 
array([[[ 0, 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, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39]]]) 

In [10]: b[:3] 
Out[10]: 
array([[[ 0, 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, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39]], 

     [[40, 41, 42, 43, 44], 
     [45, 46, 47, 48, 49], 
     [50, 51, 52, 53, 54], 
     [55, 56, 57, 58, 59]]]) 

Hàng cuối cùng của a[:10] là ở giữa b[3,:,:].

Lưu ý rằng b[:2](2,4,5), 8 hàng của a, chia thành 2 bộ 4.

Bây giờ nếu bạn muốn thực hiện c=a.reshape(4,5,5), sau đó c[:2] sẽ có những người cùng 10 dòng - trong 2 bộ 5. Và c[:2].reshape(10,-1) trông giống như a[:10].

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