2016-09-14 3 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'を2つのフィールド( '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')]) 

はまた、私は思っていました。あなたはコピーしないであろう配列の新しいビュー(np.view)を作成し、これを行うことができ

答えて

3

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