在numpy中合并多维数据

2024-04-25 20:08:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有1-d NumPy数组,它们表示n-d网格上的点。每个NumPy数组表示维度中的点。我想生成一个合并的NumPy数组,它将有一个形状为(n , m)的n-d网格,其中nlen(dim-1) * len(dim-2) * ...m是维数

例如(二维情况):

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维上实现这一点,而不必在每个数组中循环?你知道吗


Tags: 方法innumpy网格lennp情况数组
3条回答

您只需使用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)]

您可以使用^{}来创建扩展版版本,然后对这些版本的列主版本使用^{},如下所示-

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

这不是一个非常优雅的解决方案,但它可以完成:

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

相关问题 更多 >