web-dev-qa-db-ja.com

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

問題は、matrix1の最初の列を選択してvector1に入れると、行ベクトルに変換されるため、matrix2と連結しようとすると、次元エラーが発生することです。これができた。

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

しかし、これは、行列とベクトルを連結する必要があるたびに行うにはtoすぎるように見えます。これを行う簡単な方法はありますか?

21
siamii

より簡単な方法は

vector1 = matrix1[:,0:1]

理由のために、 私の別の答え を参照させてください:

a[4]のようなものを記述すると、それは配列の5番目の要素にアクセスし、元の配列の一部のビューを表示しません。たとえば、aが数値の配列である場合、a[4]は単なる数値になります。 aが2次元配列、つまり実質的に配列の配列である場合、a[4]は1次元配列になります。基本的に、配列要素にアクセスする操作は、元の配列よりも1少ない次元を持つ何かを返します。

26
David Z

他の3つのオプションは次のとおりです。

  1. ベクトルの行次元を暗黙的に設定できるようにすることで、ソリューションを少し整理できます。

    np.hstack((vector1.reshape(-1, 1), matrix2))
    
  2. np.newaxis(または同等に、None)でインデックスを作成して、サイズ1の新しい軸を挿入できます。

    np.hstack((vector1[:, np.newaxis], matrix2))
    np.hstack((vector1[:, None], matrix2))
    
  3. 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))
    
16
ali_m