У меня есть два массива numpy с формами (5741, 20000) и (5741, 11) соответственно. Как я могу объединить их в один массив формы (5741, 2), т.е. каждая строка вновь созданного массива должна содержать строку первого массива и строку второго массива ?!
Бывший:
A = [(1, 1),
(2, 2),
(3, 3)]
B = [(A),
(B),
(C)]
new_array = [((1, 1), (A)),
((2, 2), (B)),
((3, 3), (C))]






In [65]: A = np.arange(6).reshape(3,2)
In [66]: B = np.arange(3).reshape(3,1)
hstack или объединение по последнему измерению создает массив (n, 3)
In [67]: np.concatenate((A,B),axis=1)
Out[67]:
array([[0, 1, 0],
[2, 3, 1],
[4, 5, 2]])
Сложнее создать массив, содержащий подмассивы разной длины. Хорошей отправной точкой является массив объектов желаемой формы:
In [68]: C = np.empty((3,2),dtype=object)
In [69]: C[:,0] = A
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-69-928e3f2975cf> in <module>()
----> 1 C[:,0] = A
ValueError: could not broadcast input array from shape (3,2) into shape (3)
Но даже при этом копирование массивов в слоты объектов может быть непростым делом. Копировать списки в слоты проще:
In [70]: C[:,0] = A.tolist()
In [71]: C[:,1] = B.tolist()
In [72]: C
Out[72]:
array([[list([0, 1]), list([0])],
[list([2, 3]), list([1])],
[list([4, 5]), list([2])]], dtype=object)
Приложив немного больше усилий, я мог бы превратить это в массив массивов, а не в список. Или, может быть, массив кортежей?
Вы действительно понимаете, что будет включать в себя этот массив (n, 2)?
[((1, 1), (A)),
((2, 2), (B)),
((3, 3), (C))]
Другой подход - это структурированный массив:
In [74]: D = np.empty(3, dtype=[('x',int,2), ('y',int)])
In [75]: D['x']=A
In [76]: D['y']=B
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-76-fbab1c580883> in <module>()
----> 1 D['y']=B
ValueError: could not broadcast input array from shape (3,1) into shape (3)
In [77]: D['y']=B.flat
In [78]: D
Out[78]:
array([([0, 1], 0), ([2, 3], 1), ([4, 5], 2)],
dtype=[('x', '<i8', (2,)), ('y', '<i8')])
Другой способ записи A и B в C:
In [81]: C[:,1]=B.ravel()
In [83]: for i in range(3): C[i,0]=A[i]
In [84]: C
Out[84]:
array([[array([0, 1]), 0],
[array([2, 3]), 1],
[array([4, 5]), 2]], dtype=object)
или написание кортежей:
In [85]: for i in range(3): C[i,0]=tuple(A[i])
In [87]: for i in range(3): C[i,1]=tuple(B[i])
In [88]: C
Out[88]:
array([[(0, 1), (0,)],
[(2, 3), (1,)],
[(4, 5), (2,)]], dtype=object)
Уверен, что для этого есть 1000 дубликатов ..