python - numpy:如何从矩阵向量构造向量矩阵

标签 python numpy matrix vector

我是 numpy 的新手,
因此,对于 numpy,是否可以使用矩阵向量来获得向量矩阵”
例如:

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

matrix2(  
[  
 [2, 4, 6],  
 [2, 4, 6],  
 [2, 4, 6]  
])

-->

matrix(  
[  
 [array('1 2'), array('2 4'), array('3 6')],  
 [array('1 2'), array('2 4'), array('3 6')],  
 [array('1 2'), array('2 4'), array('3 6')]  
])

我是 numpy 的新手,所以我不确定是否允许将任何东西放入 numpy 的矩阵或只是数字。
从谷歌那里得到答案并不容易,比如“矩阵的向量和矩阵的向量”这样的描述

最佳答案

numpy没有与“矩阵”分开的“向量”概念。它确实有不同的“矩阵”和“数组”概念,但大多数人完全避免使用矩阵表示。如果使用数组,则“向量”、“矩阵”和“张量”的概念都包含在数组“形状”属性的一般概念下。

在这个世界观中,向量和矩阵都是二维数组,仅通过它们的形状来区分。行向量是形状为 (1, n) 的数组,而列向量是形状为 (n, 1) 的数组.矩阵是形状为 (n, m) 的数组.一维数组有时会表现得像向量,这取决于上下文,但通常你会发现除非你“升级”它们,否则你不会得到你想要的。

考虑到所有这些,这里有一个可能的答案来回答您的问题。首先,我们创建一个一维数组:

>>> a1d = numpy.array([1, 2, 3])
>>> a1d
array([1, 2, 3])

现在我们 reshape 它以创建一个列向量。 -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 来使用新的 @运算符,它为数组的矩阵乘法提供了明确的内联符号。 1

对于数组,乘法始终是按元素进行的。但有时有广播。对于具有相同形状的值,它是简单的元素乘法:
>>> 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]])

如果你想要一个点积,你必须使用 @运算符(operator):
>>> 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. 遗憾的是,这只存在于 Python 3.5 中。如果您需要使用较早的版本,所有相同的建议都适用,只是不使用 a @ b 的内联符号。 , 你必须使用 np.dot(a, b) . numpymatrix类型覆盖 *表现得像 @ ...但是你不能以同样的方式进行元素乘法或广播!所以即使你有更早的版本,我也不建议使用 matrix类型。

关于python - numpy:如何从矩阵向量构造向量矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44573474/

相关文章:

python - 查看不同数据类型下的对象数组

python - 优化使用数组索引作为函数的嵌套 for 循环

javascript - 如何将矩阵信息转换为简单的 x 和 y 坐标

python - 使用带约束的 linalg 求解系统

python - 对数组进行排序并将索引追溯到其排序顺序

python - 如何根据条件计算numpy数组的每个元素

python - 如何获取 multiprocessing.Pool.apply_async 的结果

python - 组合三个正则表达式

python - "is"运算符对整数的行为异常

python - Tensorflow:tf.case 参数化可调用,案例列表在 for 循环中定义