【问题标题】:Dealing with N by 1 matrices in Numpy在 Numpy 中处理 N×1 矩阵
【发布时间】:2014-03-13 16:04:49
【问题描述】:

给定一个大小为 (n,) 的 numpy 数组,如何将其转换为大小为 (n,1) 的 numpy 数组。

原因是因为我试图将矩阵相乘到大小为 (n,)(,n) 的 numpy 数组以获得 (n,n) 但当我这样做时:

numpy.dot(a,b.T)

它说你不能这样做。我知道,转置 (n,) 没有任何作用,因此最好更改 (n,) 并使其变为 (n,1) 并一起避免这个问题。

【问题讨论】:

  • 如果您想在这种情况下简化使用 1D 或 2D 输入的操作,请查看 np.atleast_2d。但是,atleast_2d 将使其成为行向量而不是列向量。如果您希望 1D 数组成为列向量(而 2D 单独使用),您可以使用 np.column_stack([array])np.c_[array]

标签: python arrays numpy matrix


【解决方案1】:

您可以将None 用于您希望被视为退化的维度。

a = np.asarray([1,2,3])
a[:]
a[:, None]

In [48]: a
Out[48]: array([1, 2, 3])

In [49]: a[:]
Out[49]: array([1, 2, 3])

In [50]: a[:, None]
Out[50]: 
array([[1],
       [2],
       [3]])

【讨论】:

  • 所以 a[:,None] 使它成为一个大小为(n×1)的列向量?退化是什么意思?
  • 一个不包含数据但需要存在以用于调整大小的单一维度。有一些工具可以使其具有任意 size-0 尺寸。
【解决方案2】:

使用reshape (-1,1)(n,) 重塑为(n,1),查看详细示例:

In [1]:

import numpy as np
A=np.random.random(10)
In [2]:

A.shape
Out[2]:
(10,)
In [3]:

A1=A.reshape(-1,1)
In [4]:

A1.shape
Out[4]:
(10, 1)
In [5]:

A.T
Out[5]:
array([ 0.6014423 ,  0.51400033,  0.95006413,  0.54321892,  0.2150995 ,
        0.09486603,  0.54560678,  0.58036358,  0.99914564,  0.09245124])
In [6]:

A1.T
Out[6]:
array([[ 0.6014423 ,  0.51400033,  0.95006413,  0.54321892,  0.2150995 ,
         0.09486603,  0.54560678,  0.58036358,  0.99914564,  0.09245124]])

【讨论】:

  • 那 (reshape(-1,1) ) 会对任意 (n x k) numpy 数组做什么?我只是非常讨厌将插入代码视为特殊情况,因为 numpy 会处理(n 乘 1)。
  • 您介意口头解释一下您的解决方案的作用吗? (看起来它有效,但你怎么知道这样做)?
  • 对于(n,k) 数组,它将被重新整形为(n*k, 1)
  • 当然,请参阅docs.scipy.org/doc/numpy/reference/generated/… 中的最后一个示例,基本上当您将维度设置为-1 时,该维度未指定,并且将推断其大小。当您有一个(n,) 数组时,总大小为nreshape(-1,1) 将推断第一个维度为n,以保持总大小不变。
猜你喜欢
  • 2020-06-21
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2014-10-18
相关资源
最近更新 更多