Подтвердить что ты не робот

Преобразование вектор-строки в вектор столбца в NumPy

import numpy as np

matrix1 = np.array([[1,2,3],[4,5,6]])
vector1 = matrix1[:,0] # This should have shape (2,1) but actually has (2,)
matrix2 = np.array([[2,3],[5,6]])
np.hstack((vector1, matrix2))

ValueError: all the input arrays must have same number of dimensions

Проблема заключается в том, что, когда я выбираю первый столбец матрицы1 и помещаю его в vector1, он преобразуется в вектор строки, поэтому, когда я пытаюсь конкатенировать с матрицей2, я получаю ошибку измерения. Я мог бы это сделать.

np.hstack((vector1.reshape(matrix2.shape[0],1), matrix2))

Но это выглядит слишком уродливо для меня делать каждый раз, когда мне приходится конкатенировать матрицу и вектор. Есть ли более простой способ сделать это?

4b9b3361

Ответ 1

Чем проще

vector1 = matrix1[:,0:1]

По этой причине позвольте мне отсылать вас к другому ответу:

Когда вы пишете что-то вроде a[4], которое обращается к пятому элементу массива, не дает вам взглянуть на какой-либо раздел исходного массива. Так, например, если a - массив чисел, то a[4] будет просто числом. Если a является двумерным массивом, то есть эффективно массивом массивов, то a[4] будет одномерным массивом. В принципе, операция доступа к элементу массива возвращает что-то с размерностью, меньшей, чем исходный массив.

Ответ 2

Вот три других варианта:

  • Вы можете немного убрать свое решение, разрешив размер строки в строке неявно:

    np.hstack((vector1.reshape(-1, 1), matrix2))
    
  • Вы можете индексировать с помощью np.newaxis (или эквивалентно, None) для вставки новой оси размера 1:

    np.hstack((vector1[:, np.newaxis], matrix2))
    np.hstack((vector1[:, None], matrix2))
    
  • Вы можете использовать np.matrix, для которого индексирование столбца с целым числом всегда возвращает вектор столбца:

    matrix1 = np.matrix([[1, 2, 3],[4, 5, 6]])
    vector1 = matrix1[:, 0]
    matrix2 = np.matrix([[2, 3], [5, 6]])
    np.hstack((vector1, matrix2))