假设我有一个函数f(i,j,a)
,它从2D-numPy数组a
中获取行和列,并返回另一个2 x 2 numPy数组,其中i,j
位于左上角b
,即
def f(i,j,a):
b = a[np.arange(2)[:, np.newaxis] + i, np.arange(2) + j]
return b
(The上述代码可以通过用某个其他数字替换2来推广)。我想通过定义f(i_array,j_array,a)
来向量化这个过程,本质上是通过迭代i,j
。这对于列表理解来说很简单:b_array = np.array([ f(i,j,a) for i in i_array, for j in j_array])
。
有没有更有效的方法可以直接使用numPy函数/索引来实现这一点,或者列表理解是我能做的最好的方法?我知道np.vectorize
可以做到这一点,但我不认为它比简单的列表理解更快。
1条答案
按热度按时间b4lqfgs41#
我想出来了(但我的解决方案有点不好,所以任何修改)将不胜感激)。我的代码看起来像:
在这里,我们利用广播来生成前一个矩阵的
np.array
。i_matrix
项取np.arange(2)
,将其维数增加2,并使用广播将所有可能的i_transposed
添加到2,从而形成(2, 1, 2)
数组。j_matrix
也是如此,只是它低了一个维度。然后我们使用numPy索引在grid[i_matrix, j_matrix]
中广播。由于我们广播的方式,尺寸是错误的,所以我们必须使用np.swapaxes.
通过将
np.arange(2)
替换为您希望坐标具有的任何偏移量,这应该可以更普遍地工作。