#python #pandas #numpy #scipy #concatenation
#python #pandas #numpy #scipy #объединение
Вопрос:
Для простоты у меня есть 4 вектора (тип numpy.ndarray), каждый размером 256, и я хочу создать новую матрицу, где каждый столбец соответствует каждому вектору. Итак, после конкатенации у меня будет матрица 256 * 4
Я пробовал либо использовать hstack, либо np.concatenate, но я не получаю желаемого результата..
Заранее спасибо
Ответ №1:
С помощью vstack
и transpose T
:
n = 256
a = np.arange(n) 0
b = np.arange(n) 1
c = np.arange(n) 2
d = np.arange(n) 3
x = np.vstack([a,b,c,d]).T
x
Вывод:
array([[ 0, 1, 2, 3],
[ 1, 2, 3, 4],
[ 2, 3, 4, 5],
...,
[253, 254, 255, 256],
[254, 255, 256, 257],
[255, 256, 257, 258]])
Или, альтернативно, также существует column_stack
метод:
x = np.column_stack([a,b,c,d])
И если вы хотите получить его как фактический, matrix
вместо ndarray
:
m = np.matrix([a,b,c,d]).T
Обновить:
Чтобы сделать это с помощью цикла, вы можете собрать свои массивы в список, а затем сложить их вместе:
n = 256
l = []
for i in range(4):
l.append(np.arange(n) i)
x = np.vstack(l).T
x
Или, альтернативно, складывайте их по одному на каждом шаге цикла и транспонируйте после цикла:
n = 256
x = np.arange(n)
for i in range(1,4):
x = np.vstack([x, np.arange(n) i])
x = x.T
x
Комментарии:
1.
np.stack
также может использоваться (с axis= 1). Все они делают одно и то же — расширяют размеры всех входных данных и объединяют.2. Привет @ perl, можете ли вы привести мне пример, где это делается в цикле for? т. Е. Как объединить, потому что я хочу выполнить один и тот же процесс с разной длиной .. например x = np.vstack([a1, a1, …, a10]). T, если я хочу 10 столбцов
3. @Er1Hall: Конечно, пожалуйста, посмотрите раздел Обновления моего ответа
4. Повторение
vstack
происходит медленнее.5. Да, я также рассчитал время и поставил вариант с лучшей производительностью первым. Однако я включил второй вариант на случай, если OP заинтересован в работе с матрицей внутри самого цикла