2013-08-26 52 views
7

xem xét ví dụ đơn giản sau:Làm thế nào để gán một mảng numpy 1D cho mảng numpy 2D?

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 

X[:,0] = x # WORKS 

X[:,0:1] = x # returns ERROR: 
# ValueError: could not broadcast input array from shape (10) into shape (10,1) 

X[:,0:1] = (x.reshape(-1, 1)) # WORKS 

Ai đó có thể giải thích tại sao NumPy có vectơ hình dạng (N,) chứ không phải (N, 1)? Cách tốt nhất để làm việc đúc từ mảng 1D thành mảng 2D là gì?

Tại sao tôi cần điều này? Vì tôi có mã chèn kết quả x vào mảng 2D X và kích thước x thay đổi theo thời gian nên tôi có X[:, idx1:idx2] = x hoạt động nếu x là 2D quá nhưng không nếu x là 1D.

Trả lời

4

Bạn có thực sự cần có khả năng xử lý cả đầu vào 1D và 2D với cùng chức năng? Nếu bạn biết đầu vào sẽ là 1D, sử dụng

X[:, i] = x 

Nếu bạn biết đầu vào sẽ là 2D, sử dụng

X[:, start:end] = x 

Nếu bạn không biết kích thước đầu vào, tôi khuyên bạn nên chuyển đổi giữa một dòng hoặc một với một if, mặc dù có thể có một số lừa chỉ mục tôi không biết rằng sẽ xử lý cả hai giống hệt nhau.

x của bạn có hình dạng (N,) thay vì hình dạng (N, 1) (hoặc (1, N)) vì không được xây dựng cho phép toán ma trận. ndarrays là n-chiều; chúng hỗ trợ các hoạt động vector hóa hiệu quả, nhất quán cho bất kỳ số thứ nguyên không âm nào (bao gồm 0). Mặc dù điều này đôi khi có thể làm cho hoạt động ma trận ít ngắn gọn hơn (đặc biệt trong trường hợp dot cho phép nhân ma trận), nó tạo ra mã áp dụng chung hơn cho khi dữ liệu của bạn tự nhiên là 1 chiều hoặc 3, 4, hoặc n-chiều.

0

Tôi nghĩ bạn có câu trả lời đã được đưa vào câu hỏi của bạn. Numpy cho phép các mảng có kích thước bất kỳ (trong khi afaik Matlab thích hai chiều nếu có thể), vì vậy bạn cần phải chính xác với điều này (và luôn phân biệt giữa (n,) và (n, 1)). Bằng cách cho một số làm một trong các chỉ mục (như 0 trong hàng thứ 3), bạn giảm thứ nguyên theo một chỉ số. Bằng cách đưa ra một phạm vi như một trong các chỉ số (như 0: 1 trong hàng thứ 4), bạn không làm giảm kích thước.

Dòng 3 có ý nghĩa hoàn hảo đối với tôi và tôi sẽ gán cho mảng 2-D theo cách này.

0

Dưới đây là hai thủ thuật làm cho mã ngắn hơn một chút.

X = numpy.zeros([10, 4]) # 2D array 
x = numpy.arange(0,10) # 1D array 
X.T[:1, :] = x 
X[:, 2:3] = x[:, None] 
+2

Bạn có thể thêm một số bình luận khác không? Nó không rõ ràng với tôi làm thế nào bạn có ở đây từ mã ban đầu, và tại sao điều này giải quyết vấn đề. – brandones

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