Как я могу объединить массивы кортежей, созданных с помощью dtype? - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь объединить два массива, созданных в этой форме:

data1 = numpy.array([(1,2,3),(4,5,6)], dtype={'names':['a', 'b', 'c'], 'formats':[int, float, float]})
data2 = numpy.array([(11,22),(44,55)], dtype={'names':['d', 'e'], 'formats':[int, float]})

Я хочу получить что-то в этой форме:

array([(1, 2., 3., 11, 22.), (4, 5., 6., 44, 55.)],
      dtype=[('a', '<i8'), ('b', '<f8'), ('c', '<f8'), ('d', '<i8'), ('e', '<f8')])

Как я могу это сделать?

Этот код почти привел меня туда, но я не могу понять, как объединить dtypes:

  m = []
  for i,j in zip(data1, data2):
    print(i,j)
    m.append( (*i,*j) )

Дополнительный вопрос:

Упрощаются ли подобные манипуляции с pandas?

Я в основном хочу массивы с именованными полями и типом, которые я могу легко построить, вывести в CSV-файлы (с заголовком) и к которым я могу легко добавить дополнительные столбцы и строки, если это необходимо. (например: вычислить новый столбец из других столбцов, добавить строки из другого набора данных)

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

1 Ответ

1 голос
/ 24 апреля 2020

Вы можете использовать numpy.lib.recfunctions, как предлагается в комментариях:

import numpy.lib.recfunctions as rfn

arrays = [data1, data2]

m = rfn.merge_arrays(arrays, flatten = True)

Вывод:

m:

[(1, 2., 3., 11, 22.) (4, 5., 6., 44, 55.)]

m.dtype:

[('a', '<i8'), ('b', '<f8'), ('c', '<f8'), ('d', '<i8'), ('e', '<f8')]

ОБНОВЛЕНИЕ : Если данные1 и данные2 имеют общие поля:

common_fields = set(data1.dtype.names).intersection(set(data2.dtype.names))

#remove common fields from data1 (simply change to data2 if you wish to remove from data2)
data1 = data1[[name for name in data1.dtype.names if name not in common_fields]]

arrays = [data1, data2]
m = rfn.merge_arrays(arrays, flatten = True)
...