numpy - 在 Numpy 中编写向量矩阵乘积的紧凑而自然的方法
问题描述
在科学计算中,我经常想做向量乘法,比如
一个x b ^T
其中a和b是行向量,b ^T 是向量的转置。因此,如果a和b的形状为 [n, 1] 和 [m, 1],则生成的矩阵的形状为 [n, m]
在 numpy 中写这个乘法是否有一个好的和直接的方法?
例子:
a = np.array([1,2,3])
b = np.array([4,5,6,7])
手动添加轴工作:
a[:,np.newaxis] @ b[np.newaxis,:]
并给出正确的结果:
[[ 4 5 6 7]
[ 8 10 12 14]
[12 15 18 21]]
爱因斯坦符号将是另一种方式,但仍然有些奇怪。
np.einsum('a,b->ab', a,b)
我希望工作但不起作用的内容如下:
a @ b.T
还有其他方法可以做到这一点吗?
解决方案
在评论中,提出了多种解决方案,我在这里总结一下:
np.outer(a,b)
,它基本上将这个乘数重新表述为一个集合问题(感谢Brenlla)a[:,np.newaxis]*b
(感谢迪瓦卡)a.reshape((-1,1)) @ b.reshape((-1,1)).T
或者也一样
a.reshape((-1,1)) @ b.reshape((1,-1))
。它有点长,但表明这些 numpy 矩阵运算实际上需要矩阵作为输入,而不仅仅是向量(感谢Warren Weckesser和 heltonbiker)
为了完整起见,我之前已经工作的示例:
a[:,np.newaxis] @ b[np.newaxis,:]
np.einsum('a,b->ab', a,b)
备注:为了进一步减少字符数,可以使用None
代替np.newaxis
.
推荐阅读
- c++ - 如何清除控制台上的cin?
- c# - 如何将与数据库连接的组合框的第一行设置为空?
- list - UI 中 Video 和 Image 之间的 Flutter 逻辑决策
- react-native - 如何清除 react-native-webview 的本地存储?
- python - 使用方法 remove() 删除列表中的元素
- javascript - 将字符串转换为数字文字(javascript)
- android - Activity.onCreate() 中的 Android 应用上下文为空
- c# - Xamarin iOS 目标 c 绑定库无法创建该类型的本机实例
- excel - Sumifs使用excel公式对列求和
- c - 当它被认为是一个 int 时,为 scanf 读取字符