2016-04-05 7 views
2

У меня есть DTYPE следующим образом:Построение np.array с перекрывающимися полями в DTYPE

pose_dtype = np.dtype([('x', np.float64), ('y', np.float64), ('theta', np.float64)]) 

Прямо сейчас, я могу написать:

pose = np.array((1, 2, np.pi), dtype=pose_dtype) 

Я хотел бы добавить xy поле в упростите работу. Я могу сделать это с помощью:

pose_dtype = np.dtype(dict(
    names=['x', 'y', 'theta', 'xy'], 
    formats=[np.float64, np.float64, np.float64, (np.float64, 2)], 
    offsets=[0, 8, 16, 0] 
)) 

Однако, теперь я больше не может построить массив, используя мой предыдущий метод, и приходится прибегать к:

pose = np.array((1, 2, np.pi, [1, 2]), dtype=pose_dtype) 

Что опасно повторы.

Можно ли каким-либо образом отметить свойства как псевдонимы друг друга, чтобы мне не приходилось иметь дело с этим?

+0

Как насчет заполнения массива с помощью поля а не по записи? 'dtype'' offsets' - довольно редкая тема для SO. Мне придется экспериментировать, чтобы найти альтернативы. – hpaulj

+0

Но вы знаете, что вы можете получить доступ к нескольким полям 'poose [['x', 'y']]'? Без каких-либо псевдонимов. – MSeifert

+0

@MSeifert: Но результат этого дает структурированный тип, а не неструктурированный - я не могу использовать 'np.dot' в результате этого – Eric

ответ

1

Эксперименты в заполнении массива на поле, а не записи

In [207]: pose_dtype = np.dtype(dict(
    names=['x', 'y', 'theta', 'xy'], 
    formats=[np.float64, np.float64, np.float64, (np.float64, 2)], 
    offsets=[0, 8, 16, 0] 
)) 

In [209]: A=np.zeros((3,),dtype=pose_dtype) 
In [210]: A 
Out[210]: 
array([(0.0, 0.0, 0.0, [0.0, 0.0]), (0.0, 0.0, 0.0, [0.0, 0.0]), 
     (0.0, 0.0, 0.0, [0.0, 0.0])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 
In [211]: A['x']=[1,2,3] 
In [212]: A 
Out[212]: 
array([(1.0, 0.0, 0.0, [1.0, 0.0]), (2.0, 0.0, 0.0, [2.0, 0.0]), 
     (3.0, 0.0, 0.0, [3.0, 0.0])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 
In [213]: A['y']=[4,5,6] 
In [214]: A 
Out[214]: 
array([(1.0, 4.0, 0.0, [1.0, 4.0]), (2.0, 5.0, 0.0, [2.0, 5.0]), 
     (3.0, 6.0, 0.0, [3.0, 6.0])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 
In [215]: A['xy'] 
Out[215]: 
array([[ 1., 4.], 
     [ 2., 5.], 
     [ 3., 6.]]) 
In [216]: A['xy']=np.arange(10,16).reshape(3,2) 
In [217]: A 
Out[217]: 
array([(10.0, 11.0, 0.0, [10.0, 11.0]), (12.0, 13.0, 0.0, [12.0, 13.0]), 
     (14.0, 15.0, 0.0, [14.0, 15.0])], 
     dtype={'names':['x','y','theta','xy'], 'formats':['<f8','<f8','<f8',('<f8', (2,))], 'offsets':[0,8,16,0], 'itemsize':24}) 

In [219]: A['xy'].dot(A['xy'].T) 
Out[219]: 
array([[ 221., 263., 305.], 
     [ 263., 313., 363.], 
     [ 305., 363., 421.]]) 

другой способ получения 2 поля как массив поплавка (не очень)

In [228]: A[['x','y']].view(float).reshape(-1,2) 
Out[228]: 
array([[ 10., 11.], 
     [ 12., 13.], 
     [ 14., 15.]]) 
+1

' x2 [['x', 'y']]. view ((np.float64, 2)) 'выполняет задание при получении двух полей, получается – Eric

+0

Я не думал использовать такой тип dtype, как в' view'. Он очищает «пересоздание» неудобства, хотя скорость такая же. Доступ к вашему «xy» быстрее. – hpaulj