2013-07-12 23 views
18
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 

Il problema è che quando seleziono la prima colonna di matrice1 e metterlo in vector1, esso viene convertito in un vettore riga, quindi quando provo per concatenare con matrice2, I ottieni un errore di dimensione. Potrei farloConvertire vettore riga di vettore colonna in NumPy

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

Ma questo sembra troppo brutto per me fare ogni volta che ho per concatenare una matrice e un vettore. C'è un modo più semplice per farlo?

risposta

13

Qui ci sono altre tre opzioni:

  1. È possibile riordinare la soluzione un po ', consentendo la dimensione di riga del vettore da impostare in modo implicito:

    np.hstack((vector1.reshape(-1, 1), matrix2)) 
    
  2. È possibile indicizzare con np.newaxis (o equivalentemente, None) per inserire un nuovo asse di dimensione 1:

    np.hstack((vector1[:, np.newaxis], matrix2)) 
    np.hstack((vector1[:, None], matrix2)) 
    
  3. È possibile utilizzare np.matrix, per i quali l'indicizzazione una colonna con un numero intero restituisce sempre un vettore colonna:

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

Il modo più semplice è

vector1 = matrix1[:,0:1] 

Per la ragione, mi permetta di rimando a another answer of mine:

Quando si scrive qualcosa come a[4], che sta accedendo al quinto elemento dell'array, senza fornire una vista di alcune sezioni dell'array originale. Quindi, ad esempio, se a è una matrice di numeri, allora a[4] sarà solo un numero. Se a è un array bidimensionale, ovvero una matrice di matrici, allora a[4] sarebbe una matrice unidimensionale. In sostanza, l'operazione di accesso a un elemento di matrice restituisce qualcosa con una dimensionalità inferiore di uno alla matrice originale.

+0

analogamente, slicing restituisce qualcosa con la stessa dimensionalità (o rango in termini di numpy) come array originale –

Problemi correlati