2016-09-14 11 views
5

I mają następujące numpy strukturalną tablicy:Dzielenie wartości pól tablicy numpy które są matryce do kolumny wektory

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

Jak widać, pole 'F4' jest macierz:

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

My celem końcowym jest posiadanie tablicy strukturalnej numpy, która ma tylko wektory. Zastanawiałem się, jak podzielić "f4" na dwa pola ("f41" i "f42"), gdzie każde pole reprezentuje kolumnę macierzy.

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

Również się zastanawiać, czy to możliwe do osiągnięcia tego czasu, za pomocą operacji, które modyfikują układ na miejscu lub z minimalnym kopiowaniu danych pierwotnych.

Odpowiedz

3

Można to zrobić przez utworzenie nowego widoku (np.view) tablicy, która nie kopiować:

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 mogą być następnie wykorzystane zamiast x.

+0

Nice! Byłem świadomy np.view, ale nie wiedziałem, że możesz go użyć w ten sposób. – snowleopard