2013-10-18 14 views
12

Là một phần của chương trình rộng hơn tôi đang làm việc, tôi đã kết thúc với mảng đối tượng với chuỗi, tọa độ 3D và vv. Tôi biết mảng đối tượng có thể không được yêu thích nhiều so với mảng có cấu trúc nhưng tôi hy vọng để có được khoảng này mà không thay đổi rất nhiều mã.Làm thế nào để chuyển đổi một mảng Numpy 2D với đối tượng dtype thành một mảng 2D thông thường float

Cho phép giả định mỗi hàng của obj_array mảng của tôi (với N hàng) có dạng của

Single entry/object of obj_array: ['NAME',[10.0,20.0,30.0],....] 

Bây giờ, tôi đang cố gắng để tải mảng đối tượng này và cắt phối hợp 3D đoạn. Đến đây, mọi thứ hoạt động tốt chỉ đơn giản là yêu cầu cho phép nói.

obj_array[:,[1,2,3]] 

Tuy nhiên kết quả cũng là một mảng đối tượng và tôi sẽ phải đối mặt với vấn đề như tôi muốn để tạo thành một mảng 2D phao với:

size [N,3] of N rows and 3 entries of X,Y,Z coordinates 

Còn bây giờ, tôi đang Looping trên hàng và giao hàng hàng tới một hàng của một mảng đích 2D để giải quyết vấn đề. Tôi tự hỏi nếu có bất kỳ cách nào tốt hơn với các công cụ chuyển đổi mảng của numpy? Tôi đã thử một vài thứ và không thể xoay xở được.

Centers = np.zeros([N,3]) 

for row in range(obj_array.shape[0]): 
    Centers[row,:] = obj_array[row,1] 

Cảm ơn

+0

Bạn có thể hiển thị mã ví dụ đơn giản không - dữ liệu gốc trông như thế nào và mã chuyển đổi của bạn trông như thế nào? Nó sẽ làm cho nó dễ dàng hơn cho một người nào đó để cung cấp cho bạn lời khuyên thích hợp. – Floris

Trả lời

8

Nasty vấn đề nhỏ ... Tôi đã được đùa giỡn với ví dụ đồ chơi này:

>>> arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object) 
>>> arr 
array([['one', [1, 2, 3]], 
     ['two', [4, 5, 6]]], dtype=object) 

đoán đầu tiên của tôi là:

>>> np.array(arr[:, 1]) 
array([[1, 2, 3], [4, 5, 6]], dtype=object) 

Nhưng mà giữ số object dtype, vì vậy có thể sau đó:

>>> np.array(arr[:, 1], dtype=np.float) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: setting an array element with a sequence. 

Bạn thường có thể làm việc xung quanh này làm như sau:

>>> np.array(arr[:, 1], dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: expected a readable buffer object 

Không ở đây, mặc dù đã được loại khó hiểu. Rõ ràng nó là một thực tế mà các đối tượng trong mảng của bạn là danh sách mà ném đi này, như thay thế các danh sách với các bộ hoạt động:

>>> np.array([tuple(j) for j in arr[:, 1]], 
...   dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3) 
array([[ 1., 2., 3.], 
     [ 4., 5., 6.]]) 

Vì có dường như không có bất kỳ giải pháp hoàn toàn thỏa đáng, dễ nhất có lẽ là đi với:

>>> np.array(list(arr[:, 1]), dtype=np.float) 
array([[ 1., 2., 3.], 
     [ 4., 5., 6.]]) 

Mặc dù điều đó sẽ không thể rất hiệu quả, có lẽ tốt hơn để đi với một cái gì đó như:

>>> np.fromiter((tuple(j) for j in arr[:, 1]), dtype=[('', np.float)]*3, 
...    count=len(arr)).view(np.float).reshape(-1, 3) 
array([[ 1., 2., 3.], 
     [ 4., 5., 6.]]) 
1

Bạn có thể muốn sử dụng cấu trúc arr ay, để khi bạn cần truy cập tên và các giá trị độc lập, bạn có thể dễ dàng thực hiện điều đó.Trong ví dụ này, có hai điểm dữ liệu:

x = zeros(2, dtype=[('name','S10'), ('value','f4',(3,))]) 
x[0][0]='item1' 
x[1][0]='item2' 
y1=x['name'] 
y2=x['value'] 

kết quả:

>>> y1 
array(['item1', 'item2'], 
     dtype='|S10') 
>>> y2 
array([[ 0., 0., 0.], 
     [ 0., 0., 0.]], dtype=float32) 

Xem thêm chi tiết: http://docs.scipy.org/doc/numpy/user/basics.rec.html

3

Dựa trên ví dụ đồ chơi của Jaime Tôi nghĩ bạn có thể làm được điều này rất đơn giản sử dụng np.vstack():

arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object) 
float_arr = np.vstack(arr[:, 1]).astype(np.float) 

Điều này sẽ w ork bất kể các phần tử 'số' trong mảng đối tượng của bạn là mảng 1D, danh sách hoặc bộ nhớ.

1

Công trình này hoạt động tốt trên mảng mảng của bạn để chuyển đổi từ một đối tượng thành một mảng nổi. Xử lý số là cực kỳ dễ dàng sau. Cảm ơn bài đăng cuối cùng !!!! Tôi chỉ sửa đổi nó để bao gồm bất kỳ kích thước DataFrame:

float_arr = np.vstack(arr[:, :]).astype(np.float) 
+0

Đây là một bình luận nhiều hơn là một câu trả lời. Nó có liên quan đến câu trả lời của ali_m không? – jogo

0

Đây là cách nhanh hơn để chỉ chuyển đổi mảng đối tượng của bạn đến một mảng float NumPy: arr=np.array(arr, dtype=[('O', np.float)]).astype(np.float) - từ đó không có vòng lặp, chỉ số nó giống như bạn thường làm trên một mảng NumPy. Bạn sẽ phải làm điều đó trong các khối mặc dù với các kiểu dữ liệu khác nhau của bạn arr[:, 1], arr[:,2], v.v. Đã có cùng một vấn đề với đối tượng tuple NumPy được trả về từ hàm C++ DLL - chuyển đổi cho các phần tử 17M mất < 2s.

+0

Nếu bất kỳ ai thực sự đã thử giải pháp này ở trên và đã lược tả nó thì nó sẽ không bị giảm giá. – Matt

0

Sự cố này thường xảy ra khi bạn có tập dữ liệu với các loại khác nhau, thông thường, các ngày trong cột đầu tiên hoặc lâu hơn.

Những gì tôi sử dụng để làm, là lưu trữ cột ngày trong một biến khác; và lấy phần còn lại của "X matrix of features" thành X. Vì vậy, tôi có ngày và X, ví dụ.

Sau đó, tôi áp dụng việc chuyển đổi để các ma trận X như:

X = np.array(list(X[:,:]), dtype=np.float)

Hope để giúp đỡ!

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