【发布时间】:2019-02-15 04:05:16
【问题描述】:
我想在 Numpy 中使用花哨的索引、矢量化和/或广播来加速单个数组上的函数。对于数组中的每个值,我需要进行涉及相邻值的计算。因此,在我的矢量化操作中,我需要访问当前索引,以便获取它周围的索引。考虑以下简单的数组操作:
x = np.arange(36).reshape(6, 6)
y = np.zeros((6, 6))
y[:] = x + 1
我想使用类似的语法,但不是简单的增量,我想做一些事情,比如将相邻索引处的所有值添加到矢量化循环中的当前值。例如,如果索引 [i, j] == 7 周围的区域看起来像
3 2 5
2 7 6
5 5 5
我希望[i, j] 的计算值为3 + 2 + 5 + 2 + 7 + 6 + 5 + 5 + 5,并且我想对所有索引[i, j] 这样做。
这是一个简单的嵌套 for 循环(或单个 for 循环,对每个索引使用 np.sum)...但如果可能,我想使用广播和/或花式索引。对于 Numpy 语法来说,这可能是一个太复杂的问题,但我觉得应该是可能的。
本质上归结为:在广播操作期间如何引用当前索引?
【问题讨论】:
-
虽然可以访问索引 - 只需构建索引数组并将它们合并到您的计算中 - 这样做并不是使用相邻元素值的好方法。
-
@user2357112 你能详细说明为什么这不是一个好方法吗?
-
一旦你得到了索引,你想象你会用它们做什么来获取相邻元素的值?我能想象到的大多数事情要么是不可行的,要么需要显式的 Python 循环,要么会产生数组格式的相邻值,而无需使用显式索引就可以更有效地构建。
-
简短的回答是,这不是你在 numpy 中做类似事情的方式。
-
@user2357112 “可以在不使用显式索引的情况下更有效地构建。”这就是我正在寻找的方法——我不在乎使用花哨的索引,除非它能让我达到目标。本质上,我想做我所描述的,但使用 Numpy 的快速编译库而不是慢速 Python 循环。我不接受使用索引数组的想法。
标签: python python-3.x numpy array-broadcasting