web-dev-qa-db-fra.com

Convertir le vecteur ligne en vecteur colonne dans 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

Le problème est que lorsque je sélectionne la première colonne de matrix1 et que je la mets dans vector1, elle est convertie en vecteur ligne, donc lorsque j'essaie de concaténer avec matrix2, j'obtiens une erreur de dimension. Je pourrais faire ça.

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

Mais cela me semble trop moche à faire à chaque fois que je dois concaténer une matrice et un vecteur. Existe-t-il un moyen plus simple de procéder?

21
siamii

Le moyen le plus simple est

vector1 = matrix1[:,0:1]

Pour la raison, permettez-moi de vous référer à ne autre réponse de moi :

Lorsque vous écrivez quelque chose comme a[4], c'est accéder au cinquième élément du tableau, sans vous donner une vue d'une section du tableau d'origine. Ainsi, par exemple, si a est un tableau de nombres, alors a[4] ne sera qu'un nombre. Si a est un tableau à deux dimensions, c'est-à-dire effectivement un tableau de tableaux, alors a[4] serait un tableau unidimensionnel. Fondamentalement, l'opération d'accès à un élément de tableau renvoie quelque chose avec une dimensionnalité inférieure de un au tableau d'origine.

26
David Z

Voici trois autres options:

  1. Vous pouvez ranger un peu votre solution en permettant de définir implicitement la dimension de ligne du vecteur:

    np.hstack((vector1.reshape(-1, 1), matrix2))
    
  2. Vous pouvez indexer avec np.newaxis (ou de manière équivalente, None) pour insérer un nouvel axe de taille 1:

    np.hstack((vector1[:, np.newaxis], matrix2))
    np.hstack((vector1[:, None], matrix2))
    
  3. Vous pouvez utiliser np.matrix, pour lequel l'indexation d'une colonne avec un entier renvoie toujours un vecteur de colonne:

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