python - 多个阵列上的 Numpy 广播
问题描述
我有一个 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) 与 2D 索引网格相乘:
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 与 1D 索引范围相乘,将 v 与 1D 索引范围相乘,广播并合并为 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)
推荐阅读
- javascript - Stripe - 如何使用 Checkout Session (php/js) 获取订阅 ID(以取消)
- laravel - 在 Laravel 6 中调用未定义的方法 stdClass::isOnline()
- laravel - 如何在自定义规则中验证电子邮件
- android - 单击后禁用Android cordova InAppBrowser提交按钮
- reactjs - 首次在 React.js 中渲染时如何避免 init 函数调用?
- oracle - 使用 SQL Developer 连接 do DB 时没有匹配的身份验证协议
- reactjs - 提升输入字段的状态后,无法在字段中输入任何内容
- javascript - 我可以在 html 文件中使用 nodejs 库吗?
- java - 根据多个条件替换属性值
- angular - Angular子调用父函数然后父将数据传递给子