如何生成三维坐标矩阵numpy.meshgrid

sgtfey8w  于 4个月前  发布在  其他
关注(0)|答案(3)|浏览(85)

我需要生成一个矩阵,比如A,这个矩阵的元素,比如a_{ij}=(x_i,y_j)代表这个点的坐标。我需要坐标信息来做进一步的计算。看来如果我能得到这个矩阵,下面的计算应该比我用双循环(i:0:len(x_i),j:0:len(y_j))来计算每个点更有效。坐标信息是微不足道的:

num_xmesh = nx
num_ymesh = ny
x_start = xs
x_end = xe
y_start = ys
y_end = ye
x_grid=np.linspace(x_start,x_end,num_xmesh)
y_grid=np.linspace(y_start,y_end,num_ymesh)

字符串
我想知道如何用numpy生成这种矩阵。

8ulbf1ek

8ulbf1ek1#

您可以使用np.stack堆叠np.meshgrid返回的数组,以生成一个3D数组,其中前两个维度为“空间”坐标,最后一个维度为坐标值:

import numpy as np

x = [1, 2, 3]
y = [4, 5, 6]

a = np.stack(np.meshgrid(x, y, indexing="ij"), axis=-1)

>>> print(a.shape)
(3, 3, 2)

>>> print(a)
[[[1 4]
  [1 5]
  [1 6]]

 [[2 4]
  [2 5]
  [2 6]]

 [[3 4]
  [3 5]
  [3 6]]]

>>> print(a[0, 0])
[1 4]  # a_00 = (x_0, y_0)

>>> print(a[0, 1])
[1 5]  # a_01 = (x_0, y_1)

>>> print(a[1, 0])
[2 4]  # a_10 = (x_1, y_0)

字符串

osh3o9ms

osh3o9ms2#

根据您的特定要求调整num_xmesh、num_ymesh、x_start、x_end、y_start和y_end的值,以生成所需的坐标矩阵A。

num_xmesh = 5  
num_ymesh = 4  
x_start = 0
x_end = 10
y_start = 0
y_end = 8

x_grid = np.linspace(x_start, x_end, num_xmesh)
y_grid = np.linspace(y_start, y_end, num_ymesh)

X, Y = np.meshgrid(x_grid, y_grid)

A = np.array([X.flatten(), Y.flatten()]).T

print("Matrix A (Coordinates):")
print(A)

字符串

nom7f22z

nom7f22z3#

您可以考虑使用np.indicesnp.mgrid来生成不需要堆叠的单个数组:

num_mesh = [nx, ny]
start = [xs, ys]
end = [xe, ye]
grid = (np.indices(num_mesh) * (end - start) + start).transpose(1, 2, 0)

字符串

grid = (np.mgrid[:nx, :ny] * (end - start) + start).transpose(1, 2, 0)


如果你想让坐标在最后一个维度而不是第一个维度,转置是必要的。现在还不清楚你打算如何使用这个网格,所以它可能根本没有必要。
对于这个问题,你可以使用广播来避免分配整个矩阵给开始。你可以索引/重塑你的原始网格数组,或者等价地使用indices(..., sparse=True)ogrid代替mgrid
这种方法的优点是它只分配一个坐标数组一次,而不是先分配组件,然后将它们复制到结果缓冲区。这使得它更高效,可能也更快。对于小的例子来说,这不是瓶颈,但对于大的数组,你可能会注意到差异。

相关问题