2015-11-12 3 views
2

У меня есть поплавок массиву Numpyновообращенный (NX2) массив поплавков в (NX1) массив 2-кортежи

x = np.array([ 
    [0.0, 1.0], 
    [2.0, 3.0], 
    [4.0, 5.0] 
    ], 
    dtype=np.float32 
    ) 

и нужно преобразовать его в массив NumPy с кортежем DTYPE,

y = np.array([ 
    (0.0, 1.0), 
    (2.0, 3.0), 
    (4.0, 5.0) 
    ], 
    dtype=np.dtype((np.float32, 2)) 
    ) 

NumPy view s, к сожалению, здесь не работают:

y = x.view(dtype=np.dtype((np.float32, 2))) 
ValueError: new type not compatible with array. 

Есть ли шанс сделать это без повторения через x и копирование каждой записи?

+1

Посмотрите на метод 'view'. –

ответ

1

Это близко:

In [122]: dt=np.dtype([('x',float,(2,))]) 

In [123]: y=np.zeros(x.shape[0],dtype=dt) 

In [124]: y 
Out[124]: 
array([([0.0, 0.0],), ([0.0, 0.0],), ([0.0, 0.0],)], 
     dtype=[('x', '<f8', (2,))]) 

In [125]: y['x']=x 

In [126]: y 
Out[126]: 
array([([0.0, 1.0],), ([2.0, 3.0],), ([4.0, 5.0],)], 
     dtype=[('x', '<f8', (2,))]) 

In [127]: y['x'] 
Out[127]: 
array([[ 0., 1.], 
     [ 2., 3.], 
     [ 4., 5.]]) 

y имеет одно соединение поле. Это поле имеет 2 элемента.

В качестве альтернативы можно определить 2 поля:

In [134]: dt=np.dtype('f,f') 
In [135]: x.view(dt) 
Out[135]: 
array([[(0.0, 1.0)], 
     [(2.0, 3.0)], 
     [(4.0, 5.0)]], 
     dtype=[('f0', '<f4'), ('f1', '<f4')]) 

Но это форма (3,1); так перекроить:

In [137]: x.view(dt).reshape(3) 
Out[137]: 
array([(0.0, 1.0), (2.0, 3.0), (4.0, 5.0)], 
     dtype=[('f0', '<f4'), ('f1', '<f4')]) 

Помимо DTYPE, который отображает так же, как ваш y.