【问题标题】:Convert NumPy vector to 2D array / matrix将 NumPy 向量转换为二维数组/矩阵
【发布时间】:2016-02-02 12:50:31
【问题描述】:

将向量转换为二维数组的最佳方法是什么?

例如,大小为 (10, ) 的向量 b

a = rand(10,10)
b = a[1, :]
b.shape

Out: (10L,)

可以转换为大小为 (10,1) 的数组

b = b.reshape(len(b), 1)

有更简洁的方法吗?

【问题讨论】:

  • (10,1) 是一个二维数组。
  • @hpaulj 我猜 OP 的意思是“将 1d numpy 数组转换为列向量”...
  • *.com/questions/28385666/… 中比较reshapenewaxis
  • 我冒昧地编辑了标题和文字说2d

标签: python arrays numpy


【解决方案1】:

我认为最清晰的方法是使用np.expand_dims,它基本上为数组添加了一个轴。如果您使用axis=-1,则会添加一个新轴作为最后一个维度。

b = np.expand_dims(b, axis=-1)

或者如果你想让我更简洁:

b = np.expand_dims(b, -1)

【讨论】:

    【解决方案2】:

    虽然这个问题很老,但我认为仍然值得回答。

    使用这种风格:

    b = a[1:2, :]
    

    【讨论】:

    • 这将没有形状(10, 1)
    【解决方案3】:

    你也可以使用 np.asmatrix(b)

    a.shape                 #--> (12,)
    np.asmatrix(a).shape    #--> (1, 12)
    np.asmatrix(a).T.shape  #--> (12, 1)
    

    【讨论】:

    【解决方案4】:

    由于您在使用a[1, :] 进行索引时丢失了尺寸,因此需要替换丢失的尺寸以保持二维形状。考虑到这一点,您可以使用以下语法进行选择:

    b = a[1, :, None]
    

    然后b 具有所需的形状 (10, 1)。请注意,Nonenp.newaxis 相同,并插入长度为 1 的新轴。

    (这与编写b = a[1, :][:, None] 相同,但只使用一个索引操作,因此节省了几微秒。)

    如果您想继续使用reshape(这也可以用于此目的),值得记住的是,您可以将 -1 用于(最多)一个轴,以让 NumPy 找出正确的长度应该是多少:

    b.reshape(-1, 1)
    

    【讨论】:

    • 我要补充一点,.reshape 不是 inplace 操作,所以它应该是 b = b.reshape(-1, 1)inplace 版本 b.shape = (-1, 1) .
    【解决方案5】:

    使用np.newaxis:

    In [139]: b.shape
    Out[139]: (10,)
    
    In [140]: b=b[:,np.newaxis]
    
    In [142]: b.shape
    Out[142]: (10, 1)
    

    【讨论】:

    • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
    • @SuperBiasedMan - OP 并不要求理解,只是要求更简洁的表达方式。我不确定它是否可以解释为 OP 的reshape 版本可以。这是np.newaxis 变量的基本用法。
    • @SuperBiasedMan 我同意,只有代码的答案通常不会有帮助。但正如 hpaulj 所说:这里没有太多解释,上面的三个命令是不言自明的。 (看看我的其他答案,如果有必要,我总是会尝试解释我的答案的作用)。
    • 我知道没有这样的义务,但我仍然希望对否决票的性质发表评论。 (除非是 SuperBiasedMan,否则我知道评论)