2010-08-23 18 views
45

Tôi đang sử dụng gọn gàng và muốn lập chỉ mục một hàng mà không làm mất thông tin thứ nguyên.Numpy index slice mà không làm mất thông tin về kích thước

import numpy as np 
X = np.zeros((100,10)) 
X.shape  # >> (100, 10) 
xslice = X[10,:] 
xslice.shape # >> (10,) 

Trong ví dụ này xslice bây giờ là 1 chiều, nhưng tôi muốn nó là (1,10). Trong R, tôi sẽ sử dụng X [10,:, drop = F]. Có cái gì đó tương tự trong numpy. Tôi không thể tìm thấy nó trong tài liệu và không thấy một câu hỏi tương tự.

Cảm ơn!

Trả lời

29

Có lẽ dễ nhất là làm x[None, 10, :] hoặc tương đương (nhưng dễ đọc hơn) x[np.newaxis, 10, :].

Theo như lý do tại sao nó không phải là mặc định, cá nhân, tôi thấy rằng liên tục có mảng với kích thước singleton được gây phiền nhiễu rất nhanh chóng. Tôi đoán các nhà phát triển u ám cũng cảm thấy như vậy.

Ngoài ra, xử lý gọn gàng các mảng phát sóng rất tốt, vì vậy thường có rất ít lý do để giữ lại kích thước của mảng mà slice đến từ đó. Nếu bạn đã làm, sau đó những việc như:

a = np.zeros((100,100,10)) 
b = np.zeros(100,10) 
a[0,:,:] = b 

hoặc sẽ không hoạt động hoặc sẽ khó thực hiện hơn nhiều.

(Hoặc ít nhất đó là tôi đoán tại luận các NumPy dev đằng sau thả thông tin chiều khi slicing)

+4

Điều này cảm thấy sai ... – sebpiq

+1

Thực ra, 'x [10,:, None]' trả về một mảng hình dạng '(10,1)', không phải '(1,10)' .. – Lisa

+4

@Lisa: 'x [Không, 10] 'sẽ làm những gì bạn muốn. – naught101

13

Tôi đã tìm thấy một số giải pháp hợp lý.

1) sử dụng numpy.take(X,[10],0)

2) sử dụng chỉ mục lạ này X[10:11:, :]

Lý tưởng nhất, điều này sẽ là mặc định. Tôi chưa bao giờ hiểu tại sao các kích thước lại bị loại bỏ. Nhưng đó là một cuộc thảo luận cho một số ...

+0

Tùy chọn # 2 khá tuyệt vời. –

38

Một giải pháp khác là để làm

X[[10],:] 

hoặc

I = array([10]) 
X[I,:] 

Các chiều của một mảng được lưu giữ khi lập chỉ mục được thực hiện bởi một danh sách (hoặc một mảng) của các chỉ mục. Điều này là tốt đẹp bởi vì nó lá bạn với sự lựa chọn giữa giữ kích thước và ép.

+5

Đây là giải pháp tốt nhất. – Will

+1

Điều này sao chép dữ liệu mảng – Per

+0

Điều này không phải luôn luôn như vậy. Xem: 'x = np.array ([[1,2,3,4]])' nếu bạn sau đó cắt nó bằng 'x [[0], [1,2]]' bạn nhận được mảng một chiều ' ([2, 3]) 'Ý kiến ​​của tôi là khi chọn các vectơ cột hoặc hàng thì tốt nhất là làm cho slice đơn giản và sau đó sử dụng' np.reshape', Vì vậy, trong ví dụ của tôi nó sẽ là 'np.reshape (x [0, [ 1,2]], [1,2]) ' – Alexander

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