2016-09-14 20 views
5

Tôi có mảng cấu trúc NumPy sau:tách giá trị trường mảng NumPy đó là ma trận vào cột vector

x = np.array([(22, 2, -1000000000.0, [1000,2000.0]), (22, 2, 400.0, [1000,2000.0])], 
dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4',2)]) 

Như bạn thấy, lĩnh vực 'f4' là một ma trận:

In [63]: x['f4'] 
Out[63]: 
array([[ 1000., 2000.], 
     [ 1000., 2000.]], dtype=float32) 

My mục tiêu cuối cùng là có một mảng có cấu trúc gọn gàng chỉ có vectơ. Tôi đã tự hỏi làm thế nào để tách 'f4' thành hai lĩnh vực ('f41' và 'f42') trong đó mỗi lĩnh vực đại diện cho cột của ma trận.

In [67]: x 
Out[67]: 
array([(22, 2, -1000000000.0, 1000.0, 2000.0), 
     (22, 2, 400.0, 1000.0, 2000.0)], 
     dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f41', '<f4'), ('f42', '<f4')]) 

Ngoài ra tôi đã tự hỏi liệu có thể đạt được điều này khi sử dụng các thao tác sửa đổi mảng tại chỗ hoặc sao chép tối thiểu dữ liệu gốc.

Trả lời

3

Bạn có thể làm điều này bằng cách tạo ra một cái nhìn mới (np.view) của mảng, mà sẽ không sao chép:

import numpy as np 

x = np.array([(22, 2, -1000000000.0, [1000,2000.0]), 
       (22, 2, 400.0, [1000,2000.0])], 
      dtype=[('f1', '<i4'), 
        ('f2', '<i4'), 
        ('f3', '<f4'), 
        ('f4', '<f4', 2)]) 
xNewView = x.view(dtype=[('f1', '<i4'), 
         ('f2', '<i4'), 
         ('f3', '<f4'), 
         ('f41', '<f4'), 
         ('f42', '<f4')]) 
print(np.may_share_memory(x, xNewView)) # True 
print(xNewView) 
# array([(22, 2, -1000000000.0, 1000.0, 2000.0), 
#  (22, 2, 400.0, 1000.0, 2000.0)], 
#  dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), 
#    ('f41', '<f4'), ('f42', '<f4')]) 

print(xNewView['f41'])   # array([ 1000., 1000.], dtype=float32) 
print(xNewView['f42'])   # array([ 2000., 2000.], dtype=float32) 

xNewView sau đó có thể được sử dụng thay cho x.

+0

Tuyệt vời! Tôi đã nhận thức được np.view nhưng không biết bạn có thể sử dụng nó như thế này. – snowleopard

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