作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有 a = array([1, 2, 3, 4, 5])
和 b = array([10, 20, 30, 40, 50])
。我要:
array([[ -9, -19, -29, -39, -49],
[ -8, -18, -28, -38, -48],
[ -7, -17, -27, -37, -47],
[ -6, -16, -26, -36, -46],
[ -5, -15, -25, -35, -45]])
最有效的方法是什么?我有
np.transpose([a]) - np.tile(b, (len(a), 1))
但是我想知道如果 a
非常大,是否有比这更有效的方法,这不需要复制太多 b
(反之亦然)。
最佳答案
一些 NumPy 函数,例如 np.subtract
、np.add
、np.multiply
、np.divide
、np.logical_and
、np.bitwise_and
等具有“外部”方法,可用于创建等同于“乘法表”的方法:
In [76]: np.subtract.outer(a, b)
Out[76]:
array([[ -9, -19, -29, -39, -49],
[ -8, -18, -28, -38, -48],
[ -7, -17, -27, -37, -47],
[ -6, -16, -26, -36, -46],
[ -5, -15, -25, -35, -45]])
或者,使用广播:
In [96]: a[:, None] - b
Out[96]:
array([[ -9, -19, -29, -39, -49],
[ -8, -18, -28, -38, -48],
[ -7, -17, -27, -37, -47],
[ -6, -16, -26, -36, -46],
[ -5, -15, -25, -35, -45]])
两者性能差不多:
In [98]: a = np.tile(a, 1000)
In [99]: b = np.tile(b, 1000)
In [100]: %timeit a[:, None] - b
10 loops, best of 3: 88.3 ms per loop
In [101]: %timeit np.subtract.outer(a, b)
10 loops, best of 3: 87.8 ms per loop
In [102]: %timeit np.transpose([a]) - np.tile(b, (len(a), 1))
10 loops, best of 3: 120 ms per loop
关于python - 如何有效地将运算符应用于两个数组的笛卡尔积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21840670/
我是一名优秀的程序员,十分优秀!