Python中的优化矩阵乘法库(类似于Matlab),但不是numpy

2024-05-15 14:38:27 发布

您现在位置:Python中文网/ 问答频道 /正文

根据NumPydocumentation的说法,他们可能会反对他们的np.matrix类。虽然阵列有大量的用例,但它们不能做所有的事情。具体来说,它们在执行相当基本的线性代数运算时会“中断”(您可以阅读更多关于它的内容here

enter image description here

用python构建我自己的矩阵乘法模块并不太困难,但根本不会进行优化。我正在寻找另一个库,它有充分的线性代数支持,这是在BLAS(基本线性代数子程序)优化。或者至少,有没有关于如何DIY将BLAS集成到python的文档

编辑:所以有些人建议使用@操作符,这就像把一只鼹鼠推下一个洞,让它立即在相邻的洞中弹出。本质上,正在发生的是调试器的噩梦:

W*x == w*x.T
W@x == W@x.T

您希望这里出现一个错误,让您知道您在定义矩阵时犯了一个错误。但是,由于阵列沿一个轴不存储二维信息,因此我不确定是否可以通过np.array解决这个问题。(这些问题在np.matrix中并不存在,但出于某种原因,开发人员似乎坚持要删除它)


Tags: 模块内容here错误np矩阵用例事情
2条回答

如果坚持区分列向量和行向量,就可以这样做

>>> x = np.array([1, 2, 3]).reshape(-1, 1)
>>> W = np.arange(15).reshape(5, 3)
>>> x
array([[1],
       [2],
       [3]])

>>> W
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])
>>> W @ x
array([[ 8],
       [26],
       [44],
       [62],
       [80]])
>>> W @ x.T
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0,
with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 3)

您可以创建辅助函数来创建列和行向量:

def rowvec(x):
    return np.array(x).reshape(1, -1)

def colvec(x):
    return np.array(x).reshape(-1, 1)

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

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

我建议您仅在移植现有Matlab代码时使用这种类型的构造。您在读取他人编写的numpy代码时会遇到困难,许多库函数期望1D数组作为输入,而不是(1, n)形数组

实际上,numpy通过matmul操作符@提供了BLAS支持的矩阵乘法。这将调用给定类的__matmul__magic方法

在上面的示例中,您所要做的就是W @ x

其他线性代数的内容可以在np.linalg模块上找到

编辑:我想你的问题更多的是语言的风格,而不是任何技术问题。我发现这个答案非常明确: Transposing a NumPy array

此外,我发现你不太可能找到不重要的东西,因为大多数主要的机器学习/数据科学框架都依赖它

相关问题 更多 >