如何在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, :, :] == v1
和 v2_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)
这两个数组应该等效于 meshgrid
和 sparse
(meshgrid
代码执行此操作,除了使用 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)
meshgrid
用broadcast_arrays
扩展了'dense'维度,但是repeat更容易理解。
您还可以创建数组,例如v1_mesh
用正确的形状,并赋值,利用广播。
两个 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, :, :] == v1
和 v2_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)
这两个数组应该等效于 meshgrid
和 sparse
(meshgrid
代码执行此操作,除了使用 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)
meshgrid
用broadcast_arrays
扩展了'dense'维度,但是repeat更容易理解。
您还可以创建数组,例如v1_mesh
用正确的形状,并赋值,利用广播。