我是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)
但是,我不知道如何合并X
和Y
以获得适合作为算法输入的points
列表。开始时meshgrid
的方法是错误的吗?我应该使用直接的两个for循环创建完整的grid
吗?
我无法更改algo
(实际上只是scipy.spatial.KDTree
{{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')
以列主要顺序展平输入的输出 - 当它发现它不是列主要顺序时,它需要复制结果才能使它成为交替值,所以按行主要顺序,我们有我们想要的。