2014-02-15 3 views
0

Я хочу добавить два массива DTYPE и получить тот же самый тип DTYPE массива:Numpy добавить DTYPE массив

>>> dtype=[('p', '<i8'), ('l', '<f8')] 
>>> v1 = np.array([(22, 3.14), (4, 0.1)], dtype=dtype) 
>>> v1 
array([(22, 3.14), (4, 0.1)], dtype=[('p', '<i8'), ('l', '<f8')]) 

>>> v2 = np.array([(11, 3.14), (6, 0.2)], dtype=dtype) 
>>> v2 
array([(11, 3.14), (6, 0.2)], dtype=[('p', '<i8'), ('l', '<f8')]) 

Я хочу получить:

>>> array([(33, 6.28), (10, 0.3)], dtype=[('p', '<i8'), ('l', '<f8')]) 

, но я получаю:

>>> v = v1 + v2 
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'numpy.ndarray' 

или

>>> v = np.sum(v1, v2) 
... 
TypeError: cannot perform reduce with flexible type 

ответ

3

К сожалению, я не знаю более простой способ, чем вычисления каждого столбца отдельно:

import numpy as np 

dtype=[('p', '<i8'), ('l', '<f8')] 
v1 = np.array([(22, 3.14), (4, 0.1)], dtype=dtype) 
v2 = np.array([(11, 3.14), (6, 0.2)], dtype=dtype) 

v = np.empty_like(v1) 
for col in v1.dtype.names: 
    v[col] = v1[col] + v2[col] 
print(v) 
# [(33L, 6.28) (10L, 0.30000000000000004)] 

Однако, если вы установите pandas и сделать v1 и v2 DataFrames, суммируя прост:

import pandas as pd 
v1 = pd.DataFrame.from_records(v1) 
v2 = pd.DataFrame.from_records(v2) 
v = v1 + v2 
print(v) 

дает

p  l 
0 33 6.28 
1 10 0.30 
1

Если это не так важно, чтобы сохранить структуру d массив:

In [703]: v=array(v1.tolist())+array(v2.tolist()) 

In [704]: v 
Out[704]: 
array([[ 33. , 6.28], 
     [ 10. , 0.3 ]]) 

иначе, лучший способ я мог придумать только добавить столбец за столбцом, как @unutbu упоминалось.

Смежные вопросы