gpt4 book ai didi

python - Numpy 在多个阵列上广播

转载 作者:太空宇宙 更新时间:2023-11-04 00:11:36 25 4
gpt4 key购买 nike

我有一个 3 维平面的基础:(u, v)。

我想获得这个基础的所有线性组合,基本上通过我的整个平面:

对于 [0, 512[ 中的 i 和 [0, 512[ 中的 j,得到所有 (i * u + j * v)。

我需要它很快,所以 for 循环并不是一个真正的选择。我如何使用 numpy 广播来做到这一点?

看过https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html我的印象是不可能...

尝试过:

# This is an orthonormal basis but there is no guarantee it is
u = np.array([1, 0, 0])
v = np.array([0, 1, 0])
tmp = np.arange(512)
factors = itertools.combinations(tmp, 2)
pixels = factors[0] * u + factors[1] + v

但是显然不行。

这个问题有解决办法吗?如果是,那么如何?

最佳答案

将 (u, v) 与二维索引网格相乘:

ind = np.indices((512, 512))
pixels = ind[0, ..., np.newaxis] * u + ind[1, ..., np.newaxis] * v

>>> %timeit ind = np.indices((512, 512)); pixels = ind[0, ..., np.newaxis] * u + ind[1, ..., np.newaxis] * v
8.06 ms ± 69.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

将 u 与一维索引范围相乘,将 v 与一维索引范围相乘,广播并合并为 2D:

i512 = np.arange(512)[:, np.newaxis]
pixels = (i512 * u)[:, np.newaxis, :] + (i512 * v)[np.newaxis, :, :]

>>> %timeit i512 = np.arange(512)[:, np.newaxis]; pixels = (i512 * u)[:, np.newaxis, :] + (i512 * v)[np.newaxis, :, :]
4.06 ms ± 58.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - Numpy 在多个阵列上广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52367739/

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