python构造矩阵_numpy:如何从矩阵的向量构造向量矩阵

numpy没有独立于“矩阵”的“向量”概念,它确实有“矩阵”和“数组”的不同概念,但大多数人完全避免使用矩阵表示。如果使用数组,“vector”、“matrix”和“tensor”的概念都包含在数组“shape”属性的一般概念下。

在这个世界观中,向量和矩阵都是二维数组,仅以其形状区分。行向量是形状为(1, n)的数组,而列向量是形状为(n, 1)的数组。矩阵是形状为(n, m)的数组。一维数组有时会表现得像向量,这取决于上下文,但通常您会发现,除非您“升级”它们,否则无法获得所需的内容。

考虑到这些,这里有一个可能的答案来回答你的问题。首先,我们创建一个一维数组:>>> a1d = numpy.array([1, 2, 3])

>>> a1d

array([1, 2, 3])

现在,我们对其进行重新造型以创建列向量。这里的-1告诉numpy计算给定输入的正确大小。>>> vcol = a1d.reshape((-1, 1))

>>> vcol

array([[1],

[2],

[3]])

请注意此项开始和结束处的双括号。这暗示着这是一个二维数组,尽管一维的大小只有1。

我们可以做同样的事情,交换维度,得到一行。再次注意双括号。>>> vrow = a1d.reshape((1, -1))

>>> vrow

array([[1, 2, 3]])

可以看出这些是二维数组,因为一维数组的shape元组中只有一个值:>>> a1d.shape

(3,)

>>> vcol.shape

(3, 1)

>>> vrow.shape

(1, 3)

要从列向量构建矩阵,我们可以使用hstack。有很多其他方法可能更快,但这是一个很好的起点。这里,请注意[vcol]不是一个numpy对象,而是一个普通的python列表,因此[vcol] * 3与[vcol, vcol, vcol]的含义相同。>>> mat = numpy.hstack([vcol] * 3)

>>> mat

array([[1, 1, 1],

[2, 2, 2],

[3, 3, 3]])

并且vstack从行向量给出了相同的结果。>>> mat2 = numpy.vstack([vrow] * 3)

>>> mat2

array([[1, 2, 3],

[1, 2, 3],

[1, 2, 3]])

“从矩阵的向量构造向量矩阵”的任何其他解释都不太可能在numpy中生成您真正想要的东西!

既然你提到要做线性代数,这里有两个可能的操作。这假设您使用的是最新版本的python来使用新的@运算符,该运算符为数组的矩阵乘法提供了明确的内联表示法

对于数组,乘法总是按元素顺序进行。但有时也有广播。对于具有相同形状的值,这是简单的元素乘法:>>> vrow * vrow

array([[1, 4, 9]])

>>> vcol * vcol

array([[1],

[4],

[9]])

当值具有不同的形状时,如果可能,它们将一起广播以产生合理的结果:>>> vrow * vcol

array([[1, 2, 3],

[2, 4, 6],

[3, 6, 9]])

>>> vcol * vrow

array([[1, 2, 3],

[2, 4, 6],

[3, 6, 9]])

广播的工作方式与您对其他形状的期望一样:>>> vrow * mat

array([[1, 2, 3],

[2, 4, 6],

[3, 6, 9]])

>>> vcol * mat

array([[1, 1, 1],

[4, 4, 4],

[9, 9, 9]])

如果需要点积,则必须使用@运算符:>>> vrow @ vcol

array([[14]])

注意,与*运算符不同,这不是对称的:>>> vcol @ vrow

array([[1, 2, 3],

[2, 4, 6],

[3, 6, 9]])

一开始这可能有点混乱,因为这看起来与vrow * vcol相同,但不要上当。*将生成相同的结果,而不考虑参数顺序。最后,对于矩阵向量积:>>> mat @ vcol

array([[ 6],

[12],

[18]])

再次观察@和*之间的区别:>>> mat * vcol

array([[1, 1, 1],

[4, 4, 4],

[9, 9, 9]])

1。遗憾的是,这只存在于Python3.5之后。如果需要使用早期版本,则所有相同的建议都适用,除了不使用a @ b的内联表示法外,还必须使用np.dot(a, b)。numpy的matrix类型重写*以类似@的行为。。。但是你不能用同样的方式进行元素乘法或广播!因此,即使您有一个早期版本,我也不建议使用matrix类型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值