2016-09-14 2 views
5

Ich habe folgende numpy strukturierten Array:Splitting numpy Array Feldwerte, die Matrizen in Spalte sind Vektoren

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

Wie man sehen kann, Feld 'f4' ist eine Matrix:

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

My Endziel ist ein numpliges strukturiertes Array, das nur Vektoren hat. Ich habe mich gefragt, wie man 'f4' in zwei Felder ('f41' und 'f42') aufteilt, wobei jedes Feld die Spalte der Matrix darstellt.

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

Auch habe ich mich gefragt, ob es möglich war, diese zu erreichen, während unter Verwendung von Operationen, die das Array an Ort und Stelle oder mit minimalem Kopieren der Originaldaten zu ändern.

Antwort

3

Sie können dies tun, indem Sie eine neue Ansicht (np.view) der Anordnung zu schaffen, die nicht kopiert werden:

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 kann dann statt x verwendet werden.

+0

Schön! Ich kannte np.view, wusste aber nicht, dass man es so benutzen könnte. – snowleopard