【问题标题】:Numpy multiply arrays into matrix (outer product)Numpy将数组乘以矩阵(外积)
【发布时间】:2018-02-22 04:45:38
【问题描述】:

我有 2 个形状为 (5,1) 的 numpy 数组说: a=[1,2,3,4,5] b=[2,4,2,3,6]

如何制作一个矩阵,将每个第 i 个元素与每个第 j 个元素相乘?喜欢:

..a = [1,2,3,4,5]
b 
2    2, 4, 6, 8,10
4    4, 8,12,16,20
2    2, 4, 6, 8,10
3    3, 6, 9,12,15
6    6,12,18,24,30

不使用forloops?我可以使用任何重塑、减少或乘法的组合吗?

现在我沿着行和列创建每个数组的 a*b 平铺,然后将元素相乘,但在我看来必须有更简单的方法。

【问题讨论】:

标签: python arrays numpy matrix


【解决方案1】:

使用numpy.outer()numpy.transpose() 例程:

import numpy as np

a = [1,2,3,4,5]
b = [2,4,2,3,6]
c = np.outer(a,b).transpose()

print(c)

或者只是交换数组顺序:

c = np.outer(b, a)

输出;

[[ 2  4  6  8 10]
 [ 4  8 12 16 20]
 [ 2  4  6  8 10]
 [ 3  6  9 12 15]
 [ 6 12 18 24 30]]

【讨论】:

  • 谢谢!这行得通。如果您有任何建议可以使问题更易于理解,请告诉我。我忘了这叫外积 fo 向量。
  • @ZloySmiertniy,欢迎,我会在标题的末尾加上 (outer product) + 格式化代码
【解决方案2】:

由于某种原因,np.multiply.outer 似乎比np.outer 更快,用于小输入。而且广播速度更快 - 但对于更大的数组,它们几乎相等。

%timeit np.outer(a,b)
%timeit np.multiply.outer(a,b)
%timeit a[:, None]*b

100000 loops, best of 3: 5.97 µs per loop
100000 loops, best of 3: 3.27 µs per loop
1000000 loops, best of 3: 1.38 µs per loop

a = np.random.randint(0,10,100)
b = np.random.randint(0,10,100)

%timeit np.outer(a,b)
%timeit np.multiply.outer(a,b)
%timeit a[:, None]*b

100000 loops, best of 3: 15.5 µs per loop
100000 loops, best of 3: 14 µs per loop
100000 loops, best of 3: 13.5 µs per loop

a = np.random.randint(0,10,10000)
b = np.random.randint(0,10,10000)

%timeit np.outer(a,b)
%timeit np.multiply.outer(a,b)
%timeit a[:, None]*b

10 loops, best of 3: 154 ms per loop
10 loops, best of 3: 154 ms per loop
10 loops, best of 3: 152 ms per loop

【讨论】:

  • 听起来很有趣。我正在使用的矩阵非常大,比如 90K 乘以 100k 元素,所以它可能不会有任何变化
猜你喜欢
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多