考虑以下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
,但我的结果并不是真正的笛卡尔积。
答案 0 :(得分:3)
您可以转置b
和c
,然后使用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使用方面是重要的。