2015-09-24 29 views
7

Tôi đang cố gắng tìm một mẹo nhỏ gọn gàng để cắt một hàng/cột từ mảng 2d và có được một mảng (col_size x 1) hoặc (1 x row_size).Numpy - cắt 2d hàng hoặc cột vector từ mảng

Có cách nào dễ hơn sử dụng numpy.reshape() sau mỗi lần cắt không?

Chúc mừng, Stephan

+0

Bạn có thể cung cấp ví dụ về đầu vào và đầu ra mong muốn không? Bạn có muốn lấy mảng 1D hoặc mảng 2D không? –

+0

Chắc chắn! Giả sử tôi có một mảng như 'np.ones ((2,40))'. Từ mảng này tôi muốn cắt toàn bộ một hàng theo dạng 'np.array ((1,40))'. Kết quả phải là một mảng 2d – neurotronix

+1

Sử dụng np.newaxis hoặc Không để chèn một trục mới –

Trả lời

11

Bạn có thể cắt và chèn một trục mới trong một hoạt động đơn lẻ. Ví dụ, đây là một mảng 2D:

>>> a = np.arange(1, 7).reshape(2, 3) 
>>> a 
array([[1, 2, 3], 
     [4, 5, 6]]) 

Để phân loại ra một đơn cột (trở về mảng hình dạng (2, 1)), lát với None như không gian thứ ba:

>>> a[:, 1, None] 
array([[2], 
     [5]]) 

Để phân loại ra một đơn hàng (trả về mảng có hình dạng (1, 3)), cắt với None làm thứ nguyên thứ hai:

>>> a[0, None, :] 
array([[1, 2, 3]]) 
+0

Rất cám ơn! Đúng những gì tôi cần! Numpy thực sự là tuyệt vời và nhanh chóng và tất cả, nhưng không phải là rất trực quan, ít nhất là với tôi. – neurotronix

+1

Không sao cả! Lập chỉ mục/định hình lại mất một thời gian để quấn đầu của bạn xung quanh (ít nhất là nó đã làm cho tôi), nhưng có ý nghĩa sau một chút thực hành. [Docs] (http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html) khá tốt để giải thích những gì đang xảy ra ở đây (phần * basic slicing *). –

+0

Thật kỳ lạ tôi không bao giờ nghĩ rằng kết hợp việc lập chỉ mục với phần bổ sung 'None'. Tôi đoán nó chỉ là sức mạnh của thói quen, sử dụng 'None' để mở rộng kích thước của một mảng hiện có. Và nó nhanh hơn. – hpaulj

6

Hãy chỉ số một lát, danh sách hoặc mảng

X[[0],:] 
    X[0:1,4] 

Nhưng không có gì sai với reshape khác so với thực tế là nó đòi hỏi gõ là. Nó không chậm. [None,:] là một bàn tay ngắn đẹp cho nó.

Sử dụng một chỉ số danh sách có thể là ngắn nhất, nhưng nó tạo ra một bản sao (một cộng hoặc trừ?) Và chậm

Đối (100,100) nguyên mảng:

In [487]: timeit x[[50],:] 
100000 loops, best of 3: 10.3 µs per loop # slowest 

In [488]: timeit x[50:51,:] 
100000 loops, best of 3: 2.24 µs per loop # slice indexing is fast 

In [489]: timeit x[50,:].reshape(1,-1) 
100000 loops, best of 3: 3.29 µs per loop # minimal time penalty 

In [490]: timeit x[50,:][None,:] 
100000 loops, best of 3: 3.55 µs per loop 

In [543]: timeit x[None,50,:]   # **best** 
1000000 loops, best of 3: 1.76 µs per loop 

Một thử nghiệm cho bản sao là so sánh con trỏ bộ đệm dữ liệu với bản gốc.

In [492]: x.__array_interface__['data'] 
Out[492]: (175920456, False) 
In [493]: x[50,:].__array_interface__['data'] 
Out[493]: (175940456, False) 
In [494]: x[[50],:].__array_interface__['data'] 
Out[494]: (175871672, False) # different pointer 
In [495]: x[50:51,:].__array_interface__['data'] 
Out[495]: (175940456, False) 
In [496]: x[50,:][None,:].__array_interface__['data'] 
Out[496]: (175940456, False) 
+0

Cảm ơn bạn giao phối! – neurotronix

+0

Vấn đề là tôi đang triển khai mạng nơron có thể mở rộng, có thể mở rộng về kích thước lớp. Với 'reshape', tôi phải truy cập vào các thuộc tính cá thể rất thường xuyên khác nhau (ví dụ: kích thước lớp). Cuối cùng để làm cho nó đúng: khi tôi sử dụng 'a [0, None,:]' để cắt một hàng từ 'mảng' a, sau đó nó sẽ trả về một bản sao? – neurotronix

+1

'[0, None,:]' trả về một khung nhìn. – hpaulj

1

Cách tốt đẹp và dễ dàng này?

In [73]: arr = (np.arange(5, 25)).reshape(5, 4) 

In [74]: arr 
Out[74]: 
array([[ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16], 
     [17, 18, 19, 20], 
     [21, 22, 23, 24]]) 

# extract column 1 as a column vector 
In [79]: col1 = arr[:, [0]] 
In [80]: col1.shape 
Out[80]: (5, 1) 

In [81]: col1 
Out[81]: 
array([[ 5], 
     [ 9], 
     [13], 
     [17], 
     [21]]) 


# extract row 1 as a row vector 
In [82]: row1 = arr[[0], :] 

In [83]: row1.shape 
Out[83]: (1, 4) 

In [84]: row1 
Out[84]: array([[5, 6, 7, 8]]) 
+0

Cảm ơn bạn đã trả lời rõ ràng và chi tiết! Nhưng bạn đã không nhận thấy rằng câu hỏi là hơn hai tuổi? Chúc mừng :) – neurotronix

+0

@neurotronix Tôi vừa mới nhận ra điều đó. Dù sao, vì lý do sư phạm, thời gian không bao giờ quan trọng;) – kmario23

+0

Rất đúng, cảm ơn vì đã dành thời gian để đưa ra câu trả lời! – neurotronix

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