numpy 如何直接向量化一个以索引为输入并返回2x2 np.数组的函数

7rfyedvj  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(80)

假设我有一个函数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可以做到这一点,但我不认为它比简单的列表理解更快。

b4lqfgs4

b4lqfgs41#

我想出来了(但我的解决方案有点不好,所以任何修改)将不胜感激)。我的代码看起来像:

import numpy as np

def f(i_array,j_array, a):
 i_transposed, j_transposed = i_array.T, j_array.T
 i_matrix = np.arange(2)[:, np.newaxis][:, np.newaxis]+ i_transposed
 j_matrix = np.arange(2)[:, np.newaxis]+ j_transposed
 b_grids = np.swapaxes(grid[i_matrix, j_matrix].T, 1,2)

 return b_grids

在这里,我们利用广播来生成前一个矩阵的np.arrayi_matrix项取np.arange(2),将其维数增加2,并使用广播将所有可能的i_transposed添加到2,从而形成(2, 1, 2)数组。j_matrix也是如此,只是它低了一个维度。然后我们使用numPy索引在grid[i_matrix, j_matrix]中广播。由于我们广播的方式,尺寸是错误的,所以我们必须使用np.swapaxes.
通过将np.arange(2)替换为您希望坐标具有的任何偏移量,这应该可以更普遍地工作。

相关问题