如何在numpy中获取矩阵向量的网格?

How to get meshgrid of vectors of matrices in numpy?

两个 1d 向量上的普通网格 returns 每个矩阵,包含自身的副本以适应另一个的长度。

import numpy as np

a, b = np.meshgrid(np.arange(2), np.arange(3, 6))
a
Out[22]: 
array([[0, 1],
       [0, 1],
       [0, 1]])
b
Out[23]: 
array([[3, 3],
       [4, 4],
       [5, 5]])

我想要相同的,但每个元素都是一个 n-d 体积,网格仅在第一个维度上:

v1
Out[17]: 
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

v2
Out[18]: 
array([[11, 12, 13, 14, 15, 16],
       [17, 18, 19, 20, 21, 22],
       [23, 24, 25, 26, 27, 28]])

v1.shape
Out[19]: (2, 5)

v2.shape
Out[20]: (3, 6)

我想要两个网格 v1_mesh.shape==(2, 3, 5)v2_mesh.shape==(2, 3, 6)

v1_mesh[i, :, :] == v1v2_mesh[:, j, :] == v2 用于所有相关索引,就像标准网格一样。

总共 2*3=6 == np.prod([v1.shape[0], v2.shape[0]]) 种组合。


使用 a, b = np.meshgrid(v1, v2) 得到 a.shape == b.shape == (np.prod(v1.shape), np.prod(v1.shape)),这比我想要的组合更多。我只想要沿第一个轴的组合。

meshgrid 指定输入是 1d,因此在您的情况下,它实际上是 ravel 它们在前,因此是 prod 形状。

In [3]: v1=np.arange(10).reshape(2,5)
In [5]: v2=np.arange(11,29).reshape(3,6)

这两个数组应该等效于 meshgridsparsemeshgrid 代码执行此操作,除了使用 reshape 而不是 None 索引).

In [6]: v11, v21 = v1[:,None,:], v2[None,:,:]
In [7]: v11.shape
Out[7]: (2, 1, 5)
In [8]: v21.shape
Out[8]: (1, 3, 6)

我们可以用 repeat:

将它们充实到完整的形状
In [9]: v12 = np.repeat(v11,3,1)
In [10]: v22 = np.repeat(v21,2,0)
In [11]: v12.shape
Out[11]: (2, 3, 5)
In [12]: v22.shape
Out[12]: (2, 3, 6)

meshgridbroadcast_arrays扩展了'dense'维度,但是repeat更容易理解。

您还可以创建数组,例如v1_mesh用正确的形状,并赋值,利用广播。