python: numpy: конкатенация названных массивов

Рассмотрим следующий простой пример:

x = numpy.array([(1,2),(3,4)],dtype=[('a','<f4'),('b','<f4')]) y = numpy.array([(1,2),(3,4)],dtype=[('c','<f4'),('d','<f4')]) numpy.hstack((x,y)) 

Вы получите следующую ошибку:

 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python33\lib\site-packages\numpy\core\shape_base.py", line 226, in vstack return _nx.concatenate(list(map(atleast_2d,tup)),0) TypeError: invalid type promotion 

Если массив не имеет заголовков, он работает

 x = numpy.array([(1,2),(3,4)],dtype='<f4') y = numpy.array([(1,2),(3,4)],dtype='<f4') numpy.hstack((x,y)) 

Если я удалю имена из x и y, это тоже работает.

Вопрос: как конкатенировать, vstack или hstack под названием numpy array? Примечание: numpy.lib.recfunctions.stack_arrays не работает хорошо

One Solution collect form web for “python: numpy: конкатенация названных массивов”

Проблема в том, что типы разные. «Title» является частью типа, а y использует разные имена из x , поэтому типы несовместимы. Если вы используете совместимые типы, все работает нормально:

 >>> x = numpy.array([(1, 2), (3, 4)], dtype=[('a', '<f4'), ('b', '<f4')]) >>> y = numpy.array([(5, 6), (7, 8)], dtype=[('a', '<f4'), ('b', '<f4')]) >>> numpy.vstack((x, y)) array([[(1.0, 2.0), (3.0, 4.0)], [(5.0, 6.0), (7.0, 8.0)]], dtype=[('a', '<f4'), ('b', '<f4')]) >>> numpy.hstack((x, y)) array([(1.0, 2.0), (3.0, 4.0), (5.0, 6.0), (7.0, 8.0)], dtype=[('a', '<f4'), ('b', '<f4')]) >>> numpy.dstack((x, y)) array([[[(1.0, 2.0), (5.0, 6.0)], [(3.0, 4.0), (7.0, 8.0)]]], dtype=[('a', '<f4'), ('b', '<f4')]) 

Иногда dstack и т. Д. Достаточно умен, чтобы разумно использовать методы dstack , но numpy имеет никакого способа узнать, как объединить массивы записей с разными пользовательскими именами полей.

Если вы хотите объединить типы данных , вам необходимо создать новый тип данных. Не делайте ошибки, считая, что последовательность имен ( x['a'] , x['b'] …) составляет истинное измерение массива; x и y выше – 1-й массив блоков памяти, каждый из которых содержит два 32-битных поплавки, к которым можно получить доступ, используя имена 'a' и 'b' . Но, как вы можете видеть, если вы получаете доступ к отдельному элементу в массиве, вы не получите другого массива, как если бы это было действительно второе измерение. Вы можете увидеть разницу здесь:

 >>> x = numpy.array([(1, 2), (3, 4)], dtype=[('a', '<f4'), ('b', '<f4')]) >>> x[0] (1.0, 2.0) >>> type(x[0]) <type 'numpy.void'> >>> z = numpy.array([(1, 2), (3, 4)]) >>> z[0] array([1, 2]) >>> type(z[0]) <type 'numpy.ndarray'> 

Это позволяет записывающим массивам содержать гетерогенные данные; записи могут содержать как строки, так и ints, но компромисс заключается в том, что вы не получаете полную мощность ndarray на уровне отдельных записей.

Таким образом, чтобы присоединиться к отдельным блокам памяти, вам действительно нужно изменить dtype массива. Есть несколько способов сделать это, но самое простое, что я мог найти, включает малоизвестную библиотеку numpy.lib.recfunctions (которую, как я вижу, вы уже нашли!):

 >>> numpy.lib.recfunctions.rec_append_fields(x, y.dtype.names, [y[n] for n in y.dtype.names]) rec.array([(1.0, 2.0, 1.0, 2.0), (3.0, 4.0, 3.0, 4.0)], dtype=[('a', '<f4'), ('b', '<f4'), ('c', '<f4'), ('d', '<f4')]) 
  • Проверьте верхнюю или нижнюю треугольную матрицу
  • вызывать lambdify в цикле, избегать явного вызова
  • NumPy: Довольно печатать табличные данные
  • Эффективное построение таблицы в формате csv с использованием Python
  • Проверьте, нет ли массива numpy в списке массивов numpy
  • Матрица с изображением на tkinter Canvas
  • Python Pandas - изменение некоторых типов столбцов по категориям
  • Как получить воспроизводимые результаты в керасе
  • Python - лучший язык программирования в мире.