2012-11-23 40 views
5

NumPy mảng thừa nhận một danh sách các chỉ số, ví dụNhiều lát trong danh sách chỉ mục cho NumPy mảng

a = np.arange(1000) 
l = list([1,44,66,33,90,345]) 
a[l] = 22 

Nhưng phương pháp này không có tác dụng nếu chúng ta muốn sử dụng một chỉ mục lát nhiều hoặc chỉ số cộng với một lát, ví dụ.

a = np.arange(1000) 
l = list([1,44,66,33,90, slice(200,300) , slice(500,600) ]) 
a[l] = 22 

Mã này trả về một thông báo lỗi:

IndexError: too many indices 

Câu hỏi của tôi rất đơn giản: bạn có biết nếu trong NumPy hoặc scipy có tồn tại một phương pháp hiệu quả cho việc sử dụng loại lập chỉ mục?

Hoặc cách tốt nhất và hiệu quả để sử dụng phương pháp lập chỉ mục như thế này là gì?

Đừng quên rằng việc sử dụng các lát tạo ra một mã rất nhanh; và vấn đề của tôi là phải có mã càng nhanh càng tốt.

+0

Nó giúp biết cách bạn lặp lại điều này. Bạn biết điều gì trước và bạn chỉ biết gì cho mỗi lần lặp? Những khó khăn nào khác có trong vấn đề này? –

Trả lời

4

gì nói đến cái tâm của tôi:

a = np.arange(1000) 
l = np.hstack(([1, 44, 66, 33, 90], np.arange(200, 300), np.arange(500, 600))) 
a[l] = 22 

Tôi không chắc chắn nếu đó là cách đơn giản nhất, nhưng nó hoạt động.

Chỉnh sửa: bạn nói đúng rằng điều này chậm hơn so với sử dụng lát; nhưng bạn không thể tạo một đối tượng slice với các giá trị tùy ý. Có thể bạn chỉ nên thực hiện một số bài tập sau đó:

%timeit a[np.hstack(([1, 44, 66, 33, 90], np.arange(200, 300), np.arange(500, 600)))] = 22 
10000 loops, best of 3: 39.5 us per loop 

%timeit a[[1, 44, 66, 33, 90]] = 22; a[200:300] = 22; a[500:600] = 22 
100000 loops, best of 3: 18.4 us per loop 
+0

Nhưng phương pháp này không sử dụng các lát, mà rất nhanh chóng liên quan đến việc lập chỉ mục mảng. Nó hoạt động nhưng không hiệu quả. – Giggi

+0

@Giggi True; đã chỉnh sửa. Tôi không biết nếu có một cách để đạt được những gì bạn muốn, mặc dù. –

0

Bạn có thể sử dụng lập chỉ mục ưa thích để tạo danh sách chỉ mục.

l = numpy.array([1,44,66,33,90]+range(200,300)+range(500,600)) 
a[l] = 22 

Nhưng khi @Lev chỉ ra, điều này có thể không có bất kỳ nhanh hơn (mặc dù nó gần như chắc chắn sẽ được nếu bạn có thể precompute danh sách index).

Tuy nhiên, lập chỉ mục ưa thích áp dụng cho mỗi trục. Vì vậy, bạn có thể tạo chỉ mục ưa thích trên một trục và cắt bớt các mục khác, nếu điều đó giúp ích cho tất cả:

a = numpy.random.randn(4, 5, 6) 
l = numpy.array([1, 2]) 
a[l, slice(None), slice(2, 4)] = 10 
Các vấn đề liên quan