2011-01-17 36 views
7

Tôi đang cố lập chỉ mục một số numpy.array với các thứ nguyên khác nhau trong thời gian chạy. Để truy xuất ví dụ: hàng đầu tiên của một mảng * m a, bạn chỉ có thể làmLập chỉ mục một chiều numpy.array làm ma trận

a[0,:] 

Tuy nhiên, trong trường hợp một sẽ xảy ra là một vector 1xN, mã này trên trả về một lỗi index:

IndexError: too many indices

Vì mã cần được thực hiện hiệu quả nhất có thể nên tôi không muốn giới thiệu câu lệnh if. Có ai có một giải pháp thuận tiện mà lý tưởng không liên quan đến việc thay đổi bất kỳ loại cấu trúc dữ liệu?

+0

Bạn chỉ có mảng 1 và 2? – Paul

+0

Đơn giản chỉ cần định hình lại mảng thành mảng 2n 1xn thay vì đếm mảng nd chiều dài 1d là "thay đổi kiểu cấu trúc dữ liệu"? –

+0

Tất cả những điều này là các mảng 2D (mxn) về mặt lý thuyết, một số chỉ vui vẻ là các mảng 1xn, ví dụ: m = 1. Trong thực tế, chúng đại diện cho các bảng xác suất có điều kiện và trường hợp m = 1 tương ứng với một biến không có bất kỳ phụ thuộc nào. – Alain

Trả lời

9

Chỉ cần sử dụng a[0] thay vì a[0,:]. Nó sẽ trả về dòng đầu tiên cho một ma trận và mục đầu tiên cho một vectơ. Đây có phải là những gì bạn đang tìm kiếm?

Nếu bạn muốn lấy toàn bộ véc tơ trong trường hợp một chiều, bạn có thể sử dụng numpy.atleast_2d(a)[0]. Nó sẽ không sao chép vectơ của bạn - nó sẽ chỉ truy cập nó như là một mảng 1 x n 2 chiều.

+1

Tôi không biết về atleast_2d; tiện dụng. +1 –

+0

Tôi có thể thứ hai, numpy.atleast_2d rất hữu ích và chính xác những gì tôi đang tìm kiếm. Cảm ơn rất nhiều. – Alain

1

Từ phần 'array' or 'matrix'? Which should I use? của trang Numpy for Matlab Users wiki:

For array, the vector shapes 1xN, Nx1, and N are all different things. Operations like A[:,1] return a rank-1 array of shape N, not a rank-2 of shape Nx1. Transpose on a rank-1 array does nothing.

Dưới đây là một ví dụ cho thấy rằng họ không giống nhau:

>>> import numpy as np 
>>> a1 = np.array([1,2,3]) 
>>> a1 
array([1, 2, 3]) 
>>> a2 = np.array([[1,2,3]]) // Notice the two sets of brackets 
>>> a2 
array([[1, 2, 3]]) 
>>> a3 = np.array([[1],[2],[3]]) 
>>> a3 
array([[1], 
     [2], 
     [3]]) 

Vì vậy, bạn có chắc rằng tất cả các mảng của bạn 2d mảng, hoặc là một số trong số họ 1d mảng?

Nếu bạn muốn sử dụng lệnh array[0,:], tôi khuyên bạn nên sử dụng mảng 1xN 2d thay vì mảng 1d. Dưới đây là ví dụ:

>>> a2 = np.array([[1,2,3]]) // Notice the two sets of brackets 
>>> a2 
array([[1, 2, 3]]) 
>>> a2[0,:] 
array([1, 2, 3]) 
>>> b2 = np.array([[1,2,3],[4,5,6]]) 
>>> b2 
array([[1, 2, 3], 
     [4, 5, 6]]) 
>>> b2[0,:] 
array([1, 2, 3]) 
Các vấn đề liên quan