【发布时间】:2026-01-02 05:40:01
【问题描述】:
我正在尝试获取坐标数组矩阵。这与 numpy.meshgrid 不同。例如,对于 2x2 尺寸,我想要 2x2x2 输出
[[[0,0],[0,1]],
[[1,0],[1,1]]]
作为一个 numpy 数组。这可能看起来和读取更清晰的 2x2 元组矩阵:
[[(0,0),(0,1)],
[(1,0),(1,1)]]
(除了我认为你不能在 numpy 数组中包含元组,这不是重点)
这个简单的例子可以通过切换 numpy-meshgrid 输出的轴来完成(具体来说,将第一个轴移动到最后一个):
np.array(np.meshgrid([0,1],[0,1])).transpose([1,2,0])
这可以很容易地推广到任意维度,但对于超过 2 个输入,meshgrid 的行为不像我预期的那样。具体来说,返回的矩阵具有沿轴以奇数顺序变化的坐标值:
In [627]: np.meshgrid([0,1],[0,1],[0,1])
Out[627]:
[array([[[0, 0],
[1, 1]],
[[0, 0],
[1, 1]]]),
array([[[0, 0],
[0, 0]],
[[1, 1],
[1, 1]]]),
array([[[0, 1],
[0, 1]],
[[0, 1],
[0, 1]]])]
请注意,此输出的元素分别沿轴 1、0 和 2 变化。这将建立一个不正确的坐标矩阵;我需要输出按该顺序沿轴 0、1 和 2 变化。所以我可以做
In [642]: np.array(np.meshgrid([0,1],[0,1],[0,1])).swapaxes(1,2)
Out[642]:
array([[[[0, 0],
[0, 0]],
[[1, 1],
[1, 1]]],
[[[0, 0],
[1, 1]],
[[0, 0],
[1, 1]]],
[[[0, 1],
[0, 1]],
[[0, 1],
[0, 1]]]])
但这开始变得非常棘手,我不知道我是否可以在更高维度的网格输出中依靠这个顺序。 numpy.mgrid 给出了正确的顺序,但似乎不允许任意值,这是我需要的。所以这归结为两个问题:
1) 有没有一种更简洁的方法,可能是我缺少的 numpy 中的某些函数,它会生成所描述的坐标向量矩阵? 2)这种奇怪的排序真的是我们对网格网格的期望吗?有没有我可以信赖的规范?
[编辑] 跟进 Jaime 的解决方案,这里有一个更通用的函数,可以为任何感兴趣的人更明确地构建它:[编辑 2,修复了一个错误,可能是另一个错误,不能在这个权利上花费更多时间现在,这确实需要一个更常见的功能...]
def build_coords(*vecs):
coords = numpy.empty(map(len,vecs)+[len(vecs)])
for ii in xrange(len(vecs)):
s = np.hstack((len(vecs[ii]), np.ones(len(vecs)-ii-1)))
v = vecs[ii].reshape(s)
coords[...,ii] = v
return coords
【问题讨论】:
-
我喜欢做的是保留两个数组:一个用于 x 坐标,另一个用于 y 坐标。然后,您可以通过访问两个数组中具有相同索引的元素来创建坐标对。不确定这是否适合你,但这是我对这些情况的看法。
-
我喜欢做保罗方法...但是对于我把 x 和 y 压缩在一起的点
-
在这种情况下,我实际上需要整个矩阵;目标是在指定的坐标网格处评估多元函数。也许解决方案是重写函数以接受 (x, y, z, ...) 值的元组而不是坐标向量矩阵,但是我仍然遇到以正确方向生成这些值的问题,由于某种原因,哪个网格网格似乎不这样做。我真的觉得这是meshgrid中的一个错误,不是吗?
标签: python arrays numpy matrix coordinates