21
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))

但是每次我必须连接一个矩阵和一个向量时,这对我来说太难看了。有没有更简单的方法来做到这一点?

4

3 回答 3

28

更简单的方法是

vector1 = matrix1[:,0:1]

出于这个原因,让我向您推荐我的另一个答案

当您编写类似a[4]的内容时,这是在访问数组的第五个元素,而不是让您查看原始数组的某些部分。例如,如果 a 是一个数字数组,那么a[4]将只是一个数字。如果a是二维数组,即实际上是数组的数组,那么a[4]将是一维数组。基本上,访问数组元素的操作会返回比原始数组少一维的东西。

于 2013-07-12T19:56:23.427 回答
16

以下是其他三个选项:

  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))
    
于 2013-07-12T19:55:56.503 回答
0

子集

更简单的方法是对矩阵进行子集化。

>>> matrix1
[[1 2 3]
 [4 5 6]]

>>> matrix1[:, [0]] # Subsetting
[[1]
 [4]]

>>> matrix1[:, 0] # Indexing
[1 4]

>>> matrix1[:, 0:1] # Slicing
[[1]
 [4]]

我也在一个类似的问题中提到了这一点。

它的工作原理有点类似于 Pandas 数据框。如果你索引数据框,它会给你一个Series。如果您对数据框进行子集化或切片,它会为您提供一个dataframe

您的方法使用indexingDavid Z 的方法使用slicing,而我的方法使用subsetting

于 2021-11-06T04:32:33.287 回答