2015-02-16 31 views
5

Tôi cần có nhiều mảng đa dạng với cùng số hàng (mặc dù số lượng hàng biến đổi giữa các lần sử dụng) nhưng số lượng cột khác nhau. Tuy nhiên một số mảng chỉ có một cột, ví dụ.Numpy: nhận mảng 1D dưới dạng mảng 2D mà không phải định lại lại

array = np.array([1,2,3,4,5]) 

mang đến cho

#array.shape = (5,) 

nhưng tôi muốn có hình dạng công nhận là một mảng 2d, ví dụ.

#array.shape = (5,1) 

Vì vậy, hstack thực sự có thể kết hợp chúng. giải pháp hiện tại của tôi là:

array = np.atleast_2d([1,2,3,4,5]).T 
#array.shape = (5,1) 

Vì vậy, tôi đã tự hỏi, là có một cách tốt hơn để làm điều này? Có

array = np.array([1,2,3,4,5]).reshape(len([1,2,3,4,5]), 1) 

tốt hơn? Lưu ý rằng việc sử dụng [1,2,3,4,5] của tôi chỉ là một danh sách đồ chơi để làm ví dụ cụ thể. Trong thực tế, nó sẽ là một danh sách lớn hơn nhiều được chuyển vào một hàm làm đối số. Cảm ơn!

Trả lời

5

Kiểm tra mã của hstackvstack. Một, hoặc cả hai, vượt qua các đối số thông qua atleast_nd. Đó là một cách hoàn toàn có thể chấp nhận được để định hình lại một mảng.

Một số cách khác:

arr = np.array([1,2,3,4,5]).reshape(-1,1) # saves the use of len() 
arr = np.array([1,2,3,4,5])[:,None] # adds a new dim at end 
np.array([1,2,3],ndmin=2).T # used by column_stack 

hstackvstack chuyển đổi đầu vào của họ với:

arrs = [atleast_1d(_m) for _m in tup] 
[atleast_2d(_m) for _m in tup] 

kiểm tra dữ liệu:

a1=np.arange(2) 
a2=np.arange(10).reshape(2,5) 
a3=np.arange(8).reshape(2,4) 

np.hstack([a1.reshape(-1,1),a2,a3]) 
np.hstack([a1[:,None],a2,a3]) 
np.column_stack([a1,a2,a3]) 
.210

kết quả:

array([[0, 0, 1, 2, 3, 4, 0, 1, 2, 3], 
     [1, 5, 6, 7, 8, 9, 4, 5, 6, 7]]) 

Nếu bạn không biết trước thời hạn mà mảng là 1d, sau đó column_stack là dễ nhất để sử dụng. Những người khác yêu cầu một chức năng nhỏ để kiểm tra kích thước trước khi áp dụng định hình lại.

Numpy: use reshape or newaxis to add dimensions

+0

Thú vị, tôi không biết về hai cách này. Tôi sẽ thử những người với một số thử nghiệm thời gian để xem cái nào hoạt động tốt nhất, nhưng cả hai dường như ít giả tạo hơn phương pháp của tôi. Cảm ơn! – Taaam

+0

Tôi đã thêm liên kết vào câu hỏi SO có liên quan gần đây. – hpaulj

+0

Phiên bản mới nhất đã thêm mục đích chung 'ngăn xếp'. – hpaulj

1

Nếu tôi hiểu ý định của bạn một cách chính xác, bạn muốn chuyển đổi một loạt các hình dạng (N,) để một loạt các hình dạng (N, 1) để bạn có thể áp dụng np.hstack:

In [147]: np.hstack([np.atleast_2d([1,2,3,4,5]).T, np.atleast_2d([1,2,3,4,5]).T]) 
Out[147]: 
array([[1, 1], 
     [2, 2], 
     [3, 3], 
     [4, 4], 
     [5, 5]]) 

Trong trường hợp đó , bạn có thể sử dụng tránh tái định hình các mảng và sử dụng np.column_stack thay vì:

In [151]: np.column_stack([[1,2,3,4,5], [1,2,3,4,5]]) 
Out[151]: 
array([[1, 1], 
     [2, 2], 
     [3, 3], 
     [4, 4], 
     [5, 5]]) 
+0

Cảm ơn, tôi đang thực sự sử dụng này với scikit-học như vậy và họ sử dụng hstack nội bộ vì vậy tôi cần họ để được định hướng hàng. – Taaam

0

Chỉ cần thêm thông tin về câu trả lời của hpaulj. Tôi đã tò mò về bốn phương pháp được miêu tả nhanh như thế nào. Người chiến thắng là phương pháp thêm cột vào cuối mảng 1d.

Đây là những gì tôi chạy:

import numpy as np 
import timeit 

v = [1,2,3,4,5] 

print('atleast2d:',timeit.timeit(lambda:np.atleast_2d(v).T)) 
print('reshape:',timeit.timeit(lambda:np.array(v).reshape(-1,1))) # saves the use of len() 
print('v[:,None]:', timeit.timeit(lambda:np.array(v)[:,None])) # adds a new dim at end 
print('np.array(v,ndmin=2).T:', timeit.timeit(lambda:np.array(v,ndmin=2).T)) # used by column_stack 

Và kết quả:

atleast2d: 4.455070924214851 
reshape: 2.0535152913971615 
v[:,None]: 1.8387219828073285 
np.array(v,ndmin=2).T: 3.1735243063353664 
Các vấn đề liên quan