Как объединить элементы из n массивов, которые используют пользовательский dtype в numpy

#python #numpy #dtype

#python #numpy #dtype

Вопрос:

У меня есть пользовательский dtype, определенный как:

 myType = np.dtype([
    ('foo', 'u4'),
    ('bar', 'f8')
])
  

Я определяю n векторов этого пользовательского dtype (в этом примере только два):

 a=np.array([(2, 1.1), (3, 2.2)], dtype=myType)
b=np.array([(4, 3.3), (5, 4.4), (6, 5.5)], dtype=myType)
print(np.shape(a))
print(np.shape(b))
  

Я группирую n векторов в список python:

 data = [a,b]   # Will be n vectors, not just two
  

Я хочу объединить два вектора, чтобы получить вектор c, такой же, как если бы я:

 c=np.array([(2, 1.1), (3, 2.2), (4, 3.3), (5, 4.4), (6, 5.5)], dtype=myType)
print(np.shape(c))
c
  

Я пытаюсь:

 np.vstack(data)
  

Но я получаю следующую ошибку:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-67-f65a6d8e700e> in <module>
----> 1 np.vstack(data)

<__array_function__ internals> in vstack(*args, **kwargs)

~/.local/lib/python3.6/site-packages/numpy/core/shape_base.py in vstack(tup)
    281     if not isinstance(arrs, list):
    282         arrs = [arrs]
--> 283     return _nx.concatenate(arrs, 0)
    284 
    285 

<__array_function__ internals> in concatenate(*args, **kwargs)

ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 2 and the array at index 1 has size 3
  

Ответ №1:

 In [49]: a=np.array([(2, 1.1), (3, 2.2)], dtype=myType)
    ...: b=np.array([(4, 3.3), (5, 4.4), (6, 5.5)], dtype=myType)
In [50]: a
Out[50]: array([(2, 1.1), (3, 2.2)], dtype=[('foo', '<u4'), ('bar', '<f8')])
In [51]: a.shape
Out[51]: (2,)
In [52]: b.shape
Out[52]: (3,)
  

a,b являются 1d, поэтому объединение по (по умолчанию) оси 0 работает:

 In [53]: np.concatenate((a,b))
Out[53]: 
array([(2, 1.1), (3, 2.2), (4, 3.3), (5, 4.4), (6, 5.5)],
      dtype=[('foo', '<u4'), ('bar', '<f8')])
  

vstack делает (1,2) и (1,3) и пытается присоединиться к размеру 1, что приводит к ошибке. В нем довольно четко указаны размеры проблемы.

Проблема dtype не в этом — за исключением того, что вы рассматривали массивы как 2d.

Ответ №2:

Используйте np.concatenate:

 import numpy as np

myType = np.dtype([
    ('foo', 'u4'),
    ('bar', 'f8')
])

a = np.array([(2, 1.1), (3, 2.2)], dtype=myType)
b = np.array([(4, 3.3), (5, 4.4), (6, 5.5)], dtype=myType)

result = np.concatenate((a, b))
print(result)
  

Вывод

 [(2, 1.1) (3, 2.2) (4, 3.3) (5, 4.4) (6, 5.5)]
  

или np.hstack:

 result = np.hstack((a, b))