2016-09-14 96 views
5

我有以下numpy的結構化陣列:分裂numpy的陣列字段值是矩陣進列向量

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)]) 

正如你可以看到,字段「F4」是一個矩陣:

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

我最終目標是擁有一個只有向量的numpy結構化數組。我想知道如何將'f4'分成兩個字段('f41'和'f42'),其中每個字段代表矩陣的列。

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')]) 

另外我想知道如果它是能夠實現使用該修改數組代替或與原始數據的最小的複製操作這一點的同時。

回答

3

您可以通過創建數組,這將不可複製的一個新的視圖(np.view)做到這一點:

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然後可以用來代替x

+0

不錯!我知道np.view,但不知道你可以像這樣使用它。 – snowleopard