【问题标题】:Numpy.dot on multiple pairs of matrices多对矩阵上的 Numpy.dot
【发布时间】:2020-08-02 23:50:28
【问题描述】:

我有两个矩阵列表 [numpy.ndarray]:(a1,a2,a3.....,an) 和 (b1,b2,b3......,bn) 每个都是正方形一些大小的矩阵,不是所有的a矩阵都一样大,也不是所有的b矩阵都一样大,但是保证dim(a[i])==dim(b[i] )(这意味着我们只乘以相同大小的矩阵)。

我想分别对它们进行点积:a1*b1,a2*b2.....an*bn 并将结果存储在 c1,c2....等 除了在 for 循环中逐个遍历对,还有什么办法吗?

我目前正在使用:

# a_list and b_list contain n matrices each
# a[i] & b[i] are numpy.ndarray objects
a_list = [a1,a2,.....]
b_list = [b1,b2,.....]
result_list = []
for i in range(n):
    result_list.append(numpy.dot(a_list[i],b_list[i])

【问题讨论】:

  • 有什么方法可以按大小对矩阵进行分组吗?简短的回答是“不”。
  • 很遗憾没有,我现在用 ec2604 的解决方案做一些测试,看看效果如何

标签: python numpy matrix vector numpy-ndarray


【解决方案1】:

我认为公认的解决方案是 for 循环的语法糖,但是我们可以在这里寻找更有趣的选项。

从技术上讲,我们想要的是一个由 numpy 数组组成的 numpy 数组,允许我们在它们之间进行矢量化操作,类似于 np.array([1,2,3]) * np.array([3,4,5 ]) 在每个元素之间执行标量乘法。

所以我们想要一个由 numpy 数组组成的 numpy 数组,除了我们希望将 * 运算符定义为矩阵乘法而不是元素乘法。有趣的是,np.matrix 类就是这种情况。然而,需要注意的是,这个类已被弃用,可能会导致并发症,但是为了一路学习/理解事物,我们可以尝试使用这个类。 .

import nummpy as np
b_0 = np.asmatrix(np.arange(9).reshape(3, 3))

# b_0 = 0 1 2
#       3 4 5
#       6 7 8

b_1 = np.asmatrix(np.arange(4).reshape(2, 2))

# b_1 = 0 1
#       2 3   

a_0 = np.asmatrix(np.eye(3))
a_1 = np.asmatrix(np.eye(2))
a = np.asarray([a_0, a_1])
b = np.asarray([b_0, b_1])
a * b # We get [b_0, b_1])

如果这对您来说是一个重要的语法选项,您也许可以编写一个与 numpy 数组兼容的自定义类(因此不使用 np.matrix)。然而,这可能会比使用带有 np.dot 的普通旧 for 循环稍慢。

【讨论】:

  • 这个!这就是我所需要的(不要从其他解决方案中拿走任何东西),我可以开始写一堂课了,非常感谢!
【解决方案2】:

您可以使用 python 列表推导:

result_list = [a.dot(b) for a, b in zip(a_list, b_list)]

【讨论】:

  • 谢谢!它有点像这样紧凑
  • @Tomfus 它也可能稍微快一点
猜你喜欢
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2020-04-12
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多