2015-08-20 5 views
4

Рассмотрим следующие numpy.arrays:Zip неровные Numpy массивы

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

Что именно вы хотите, чтобы это произошло, когда 'a' не является самым большим массивом? – LRP

+1

Вы говорите, что каждый массив имеет произвольную длину. Итак, если 'b' и' c' имеют разные размеры, я не вижу, как вы могли бы получить результат. Попробуйте добавить еще один образец ввода-вывода для покрытия такого случая? – Divakar

+0

Должно быть уточнено. Все массивы такого же размера, кроме большого. Например, 'a' может иметь длину' m', но 'b' и' c' будут иметь одинаковую длину 'n'. –

ответ

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.])] 
>>> 
+0

Это отличный ответ, но он не работает, когда 'a' не является самым большим массивом. – LRP

+0

@LRP. Он также может иметь больше сценариев, которые OP не объясняет. Во всяком случае, я просто ответил, основываясь на вопросе ОП. – Kasramvd

+0

Исходное сообщение указывает, что 'a' может быть не самым большим массивом:« Обратите внимание, что в этом случае массив 'a' оказывается самым большим массивом. Однако это не гарантируется». –

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.]]) 
+0

@ Решение Kasramvd, похоже, дает неверный результат в этом случае использования и работает медленнее (80 мкс против 30 мкс). –

+0

Это решение возвращает массив nd, где я ищу список массивов или список кортежей. –

+0

@ strimp099 Вы можете использовать 'out.tolist()' для преобразования в список списков. Или используйте 'np.split (out, range (1, len (out)))' для списка массивов, в зависимости от вашей цели. – Divakar

0

Если различия в длине не являются экстремальными (проверьте входы первого) я был бы соблазн раздуть из коротких списков длины самой длинной с None и генерировать все перестановки (27 из них для 3 списков из 3 элементов). Тогда

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

причин не делать этого: если куб длины самого длинного списка является существенным с точки зрения использования памяти (пространство для хранения N кубиками-плюсом) или использование центрального процессора.

Смежные вопросы