gpt4 book ai didi

python - 如何有效地将运算符应用于两个数组的笛卡尔积?

转载 作者:太空狗 更新时间:2023-10-30 00:40:51 24 4
gpt4 key购买 nike

我有 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.subtractnp.addnp.multiplynp.dividenp.logical_andnp.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com