我有1-d NumPy
个数组,代表n-d网格上的点。每个NumPy
数组表示维度中的点。我想生成一个合并的NumPy
数组,其中nd网格的形状为(n , m)
,其中n
为len(dim-1) * len(dim-2) * ...
,m
为维数< / p>
例如(2-D案例):
In [1]: x = np.array([1, 2])
In [2]: x
Out[2]: array([1, 2])
In [3]: y = np.array([3, 4, 5])
In [4]: y
Out[4]: array([3, 4, 5])
In [5]: result = np.array([[1, 3], [1, 4],[1, 5],[2, 3],[2, 4],[2, 5]])
In [6]: result
Out[6]:
array([[1, 3],
[1, 4],
[1, 5],
[2, 3],
[2, 4],
[2, 5]])
另一个例子(3-D):
In [7]: x = np.array([1])
In [8]: y = np.array([2, 3])
In [9]: z = np.array([4, 5, 6])
In [10]: x
Out[10]: array([1])
In [11]: y
Out[11]: array([2, 3])
In [12]: z
Out[12]: array([4, 5, 6])
In [13]: result = np.array([[1, 2, 4], [1, 3, 4], [1, 2, 5], [1, 3, 5], [1, 2, 6], [1, 3, 6]])
In [14]: result
Out[14]:
array([[1, 2, 4],
[1, 3, 4],
[1, 2, 5],
[1, 3, 5],
[1, 2, 6],
[1, 3, 6]])
有没有办法在没有循环遍历每个数组的情况下轻松地为n维做到这一点?
答案 0 :(得分:1)
您可以使用np.meshgrid
创建扩展版本,然后在列的主要版本上使用np.column_stack
,就像这样 -
X,Y,Z = np.meshgrid(x,y,z)
out = np.column_stack((X.ravel('F'),Y.ravel('F'),Z.ravel('F')))
为了使它适用于任何数量的输入案例,我们需要一些额外的工作,如此 -
def combine_arrays(A):
return np.dstack(np.meshgrid(*A)).ravel('F').reshape(len(A),-1).T
运行示例以测试2D
和3D
个案例 -
In [67]: # 2D case
...: x = np.array([1, 2])
...: y = np.array([3, 4, 5])
...:
In [68]: combine_arrays((x,y))
Out[68]:
array([[1, 3],
[1, 4],
[1, 5],
[2, 3],
[2, 4],
[2, 5]])
In [69]: # 3D case
...: x = np.array([1])
...: y = np.array([2, 3])
...: z = np.array([4, 5, 6])
...:
In [70]: combine_arrays((x,y,z))
Out[70]:
array([[1, 2, 4],
[1, 3, 4],
[1, 2, 5],
[1, 3, 5],
[1, 2, 6],
[1, 3, 6]])
答案 1 :(得分:0)
您只需使用itertools.product
即可完成此操作
例如:
x = [1,2]
y = [3,4,5]
list(itertools.product(x, y))
# [(1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5)]
这也适用于两个以上的输入:
a = [1]
b = [2,3]
c = [4,5,6]
list(itertools.product(a,b,c))
# [(1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 3, 4), (1, 3, 5), (1, 3, 6)]
答案 2 :(得分:0)
这不是一个非常优雅的解决方案,但它会完成它:
import pandas as pd
import numpy as np
x = np.array([1, 2])
y = np.array([3, 4, 5])
pd.MultiIndex.from_product([x, y]).to_series().apply(pd.Series).values
array([[1, 3],
[1, 4],
[1, 5],
[2, 3],
[2, 4],
[2, 5]])