在numpy中结合多维数据

时间:2016-06-03 15:16:27

标签: python arrays numpy

我有1-d NumPy个数组,代表n-d网格上的点。每个NumPy数组表示维度中的点。我想生成一个合并的NumPy数组,其中nd网格的形状为(n , m),其中nlen(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维做到这一点?

3 个答案:

答案 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

运行示例以测试2D3D个案例 -

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]])