评估接受常规网格上的数组列表的算法

时间:2014-12-09 14:54:45

标签: python numpy

我是numpy的新手。我有一个算法需要一个二维数组作为输入,返回一个长度为len(Q)的一维数组。

def algo(Q):
    assert Q.ndim == 2, 'Wrong dimension'
    # Exposition only. This actually creates a new array and so on.
    return np.linspace(0,10,len(Q))

我通常会使用这样的算法:

 x = np.array([[1,2],[3,4],[5,6]]) # A list of points.
 algo(x)

我想在常规网格上评估此算法。我知道如何使用meshgrid来获取表示网格的矩阵:

x = np.linspace(0,10,10)
y = np.linspace(0,10,10)
X, Y = np.meshgrid(x,y)

但是,我不知道如何合并XY以获得适合作为算法输入的points列表。开始时meshgrid的方法是错误的吗?我应该使用直接的两个for循环创建完整的grid吗?

我无法更改algo(实际上只是scipy.spatial.KDTree {{1}}成员的包装。)

1 个答案:

答案 0 :(得分:1)

鉴于我认为我终于理解了你想要的东西,你可以使用meshgrid,如下所示:

x = np.linspace(0,10,10)
y = np.linspace(0,10,10)
X, Y = np.meshgrid(x,y)

grid_coords = np.vstack((X.ravel(), Y.ravel())).ravel('F').reshape((-1, 2))

最后一行不完全可读,但相当于

grid_coords = np.empty((X.size, 2), X.dtype)
grid_coords[:, 0] = X.ravel()
grid_coords[:, 1] = Y.ravel()

说实话,我可能会使用第二种形式来提高可读性。

编辑:使用ravel('F')是一个巧妙的技巧。它的工作原理是因为ravel('F')以列主要顺序展平输入的输出 - 当它发现它不是列主要顺序时,它需要复制结果才能使它成为交替值,所以按行主要顺序,我们有我们想要的。