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

sgtfey8w  于 2024-01-08  发布在  其他
关注(0)|答案(3)|浏览(282)

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

  1. num_xmesh = nx
  2. num_ymesh = ny
  3. x_start = xs
  4. x_end = xe
  5. y_start = ys
  6. y_end = ye
  7. x_grid=np.linspace(x_start,x_end,num_xmesh)
  8. y_grid=np.linspace(y_start,y_end,num_ymesh)

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

8ulbf1ek

8ulbf1ek1#

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

  1. import numpy as np
  2. x = [1, 2, 3]
  3. y = [4, 5, 6]
  4. a = np.stack(np.meshgrid(x, y, indexing="ij"), axis=-1)
  5. >>> print(a.shape)
  6. (3, 3, 2)
  7. >>> print(a)
  8. [[[1 4]
  9. [1 5]
  10. [1 6]]
  11. [[2 4]
  12. [2 5]
  13. [2 6]]
  14. [[3 4]
  15. [3 5]
  16. [3 6]]]
  17. >>> print(a[0, 0])
  18. [1 4] # a_00 = (x_0, y_0)
  19. >>> print(a[0, 1])
  20. [1 5] # a_01 = (x_0, y_1)
  21. >>> print(a[1, 0])
  22. [2 4] # a_10 = (x_1, y_0)

字符串

展开查看全部
osh3o9ms

osh3o9ms2#

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

  1. num_xmesh = 5
  2. num_ymesh = 4
  3. x_start = 0
  4. x_end = 10
  5. y_start = 0
  6. y_end = 8
  7. x_grid = np.linspace(x_start, x_end, num_xmesh)
  8. y_grid = np.linspace(y_start, y_end, num_ymesh)
  9. X, Y = np.meshgrid(x_grid, y_grid)
  10. A = np.array([X.flatten(), Y.flatten()]).T
  11. print("Matrix A (Coordinates):")
  12. print(A)

字符串

展开查看全部
nom7f22z

nom7f22z3#

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

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

字符串

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


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

展开查看全部

相关问题