Как объединить множество векторов в одной матрице (каждый вектор является столбцом новой матрицы)

#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 заинтересован в работе с матрицей внутри самого цикла