拉链不均匀的numpy数组

时间:2015-08-20 08:30:31

标签: python numpy

考虑以下numpy.arrays

a = np.array([1., 2., 3.])
b = np.array([4., 5.])
c = np.array([6., 7.])

我需要将这些结合起来,所以我最终得到以下结论:

[(1., 4., 6.), (1., 5., 7.), (2., 4., 6.), (2., 5., 7.), (3., 4., 6.), (3., 5., 7.)]

请注意,在这种情况下,数组a恰好是最大的数组。但是,这并不能保证。长度也不保证。换句话说,任何数组都可以是最长的,每个数组都是任意长度的。

我尝试使用itertools.izip_longest,但我只能将fillvalue用于3.的元组,这将无效。我也试过了itertools.product,但我的结果并不是真正的笛卡尔积。

3 个答案:

答案 0 :(得分:3)

您可以转置bc,然后使用a创建itertools.product与转置数组的产品:

>>> from itertools import product
>>> [np.insert(j,0,i) for i,j in product(a,np.array((b,c)).T)]
[array([ 1.,  4.,  6.]), array([ 1.,  5.,  7.]), array([ 2.,  4.,  6.]), array([ 2.,  5.,  7.]), array([ 3.,  4.,  6.]), array([ 3.,  5.,  7.])]
>>> 

答案 1 :(得分:1)

假设你有:

a = np.array([4., 5.])
b = np.array([1., 2., 3.])
c = np.array([6., 7.])
d = np.array([5., 1])
e = np.array([3., 2.])

现在,如果您事先知道哪一个是最长的数组,在这种情况下是b,您可以使用基于np.meshgrid的方法 -

# Concatenate elements from identical positions from the equal arrays 
others = np.vstack((a,c,d,e)).T # If you have more arrays, edit this line

# Get grided version of the longest array and 
# grided-indices for indexing into others array
X,Y = np.meshgrid(np.arange(others.shape[0]),b)

# Concatenate grided longest array and grided indexed others for final output
out = np.hstack((Y.ravel()[:,None],others[X.ravel()]))

示例运行 -

In [47]: b
Out[47]: array([ 1.,  2.,  3.])

In [48]: a
Out[48]: array([ 4.,  5.])

In [49]: c
Out[49]: array([ 6.,  7.])

In [50]: d
Out[50]: array([ 5.,  1.])

In [51]: e
Out[51]: array([ 3.,  2.])

In [52]: out
Out[52]: 
array([[ 1.,  4.,  6.,  5.,  3.],
       [ 1.,  5.,  7.,  1.,  2.],
       [ 2.,  4.,  6.,  5.,  3.],
       [ 2.,  5.,  7.,  1.,  2.],
       [ 3.,  4.,  6.,  5.,  3.],
       [ 3.,  5.,  7.,  1.,  2.]])

答案 2 :(得分:0)

如果长度差异不是极端(首先检查输入),我很想将较短的列表填充到最长的无限长度并生成所有排列(其中27个为3个元素的3个列表) 。然后

 results = []
 for candidate in possibles:
    if not (None in candidate): results.append(candidate)

不这样做的原因:如果最长列表的长度的多维数据集在内存使用(存储N个可能的空间的空间)或CPU使用方面是重要的。