Объединение 1D и 2D массивов в соответствии с позицией индекса - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь объединить 1D в 2D массив. Я бы не хотел делать цикл, так как он требует слишком много компьютеров, если длина моего массива превышает 1000.

Я пробовал vstack, стек и объединение безуспешно.

import numpy as np

array_a = np.array([1,2,3])

array_b = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])

Ожидаемый результат должен быть

array([[1, 10, 11, 12], [2, 20, 21, 22], [3, 30, 31, 32]])

Большое спасибо за вашу помощь!

Ответы [ 3 ]

3 голосов
/ 09 октября 2019

Николай показал правильный способ сделать это, но я подозреваю, что вам нужна небольшая помощь в понимании, почему. Вы попробовали несколько вещей, не сказав нам, что случилось.

In [241]: array_a = np.array([1,2,3]) 
     ...: array_b = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])  

vstack выполняется:

In [242]: np.vstack((array_a, array_b))                                         
Out[242]: 
array([[ 1,  2,  3],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

Но результатом является вертикальное соединение по строкам, а не по столбцам. v в vstack должно напоминать нам об этом.

stack пытается объединить массивы по оси new и требует, чтобы все входные массивы имели совпадающиеshape:

In [243]: np.stack((array_a, array_b))                                          
...
ValueError: all input arrays must have the same shape

Я подозреваю, что вы попробовали это наугад, не читая документы.

Оба они используют concatenate, который является основным столяром. Но он требователен к размерам:

In [244]: np.concatenate((array_a, array_b))                                    
...
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 2 dimension(s)

Вы ясно поняли, что число измерений не совпадает.

Вы хотите создать массив (3,4). Один из них (3,3), другой должен быть (3,1). И ось соединения должна быть 1

In [247]: np.concatenate((array_a[:,None], array_b), axis=1)                    
Out[247]: 
array([[ 1, 10, 11, 12],
       [ 2, 20, 21, 22],
       [ 3, 30, 31, 32]])

Если мы создали массив (1,3) и попытались объединить по оси 0 по умолчанию, мы получим то же самое, что и vstack. Фактически это то, что vstack делает:

In [248]: np.concatenate((array_a[None,:], array_b))                            
Out[248]: 
array([[ 1,  2,  3],
       [10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])

Другая функция:

In [249]: np.column_stack((array_a, array_b))                                   
Out[249]: 
array([[ 1, 10, 11, 12],
       [ 2, 20, 21, 22],
       [ 3, 30, 31, 32]])

Это то же самое, что и [247].

Функции типа vstack и column_stack удобны, но в долгосрочной перспективе лучше понять, как использовать concatenate.

2 голосов
/ 09 октября 2019

Вы можете reshape() первый массив, а затем concatenate() оба массива:

np.concatenate([array_a.reshape(3, -1), array_b], axis=1)
2 голосов
/ 08 октября 2019

Вы хотите вставить :

import numpy as np

array_a = np.array([1, 2, 3])

array_b = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32]])

result = np.insert(array_b, 0, array_a, axis=1)
print(result)

Выход

[[ 1 10 11 12]
 [ 2 20 21 22]
 [ 3 30 31 32]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...