#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))