2016-12-11 1 views
3
arr = [[1, 2, 4], [10, 3, 8], [16, 12, 13], [14, 4, 20]] 

Пожалуйста, помогите мне с NumPy и/или пандой для работы с 2D список:Numpy - перебрать 2D список и печать (строка, столбец) индекс

  1. Получить сумму уникальной комбинации всех элементов без повторного выбора из той же строки. Для этого массива должно быть 81 комбинация.
  2. Распечатайте строку, столбец каждого элемента в комбинации.

Например:

(1,3,12,20), Сумма = 36 и (строка, столбец) = [(0,0), (1,1), (2, 1), (3,2)]

(4,10,16,20), Sum = 50 и (строка, col) = [(0,2), (1,0), (2,0), (3,2)]

+0

Я попробовал регулярный питон 'для 'петли. Но мне нужно использовать высокопроизводительные структуры данных из numpy/panda. Я искал много форумов, но не мог найти, как перебирать все комбинации элементов. – vkb

ответ

4

подходом, создавая все такие комбинации и суммируя: Вот Векторизованный подход с использованием itertools.product и array-indexing -

from itertools import product 

a = np.asarray(arr) # Convert to array for ease of use and indexing 
m,n = a.shape 
combs = np.array(list(product(range(n), repeat=m))) 
out = a[np.arange(m)[:,None],combs.T].sum(0) 

Пример запуск -

In [296]: arr = [[1, 2, 4], [10, 3, 8], [16, 12, 13], [14, 4, 20]] 

In [297]: a = np.asarray(arr) 
    ...: m,n = a.shape 
    ...: combs = np.array(list(product(range(n), repeat=m))) 
    ...: out = a[np.arange(m)[:,None],combs.T].sum(0) 
    ...: 

In [298]: out 
Out[298]: 
array([41, 31, 47, 37, 27, 43, 38, 28, 44, 34, 24, 40, 30, 20, 36, 31, 21, 
     37, 39, 29, 45, 35, 25, 41, 36, 26, 42, 42, 32, 48, 38, 28, 44, 39, 
     29, 45, 35, 25, 41, 31, 21, 37, 32, 22, 38, 40, 30, 46, 36, 26, 42, 
     37, 27, 43, 44, 34, 50, 40, 30, 46, 41, 31, 47, 37, 27, 43, 33, 23, 
     39, 34, 24, 40, 42, 32, 48, 38, 28, 44, 39, 29, 45]) 

подход памяти эффективная: Вот подход, не создавая все эти комбинации и используя вместо этого на лета broadcasted сложений и философия очень вдохновлен this other post -

a = np.asarray(arr) 
m,n = a.shape 
out = a[0] 
for i in range(1,m): 
    out = out[...,None] + a[i] 
out.shape = out.size # Flatten 
+0

Отлично, спасибо @ Дивакар – vkb

1

Вы можете использовать функцию product из itertools:

from itertools import product  
y = [sum(p) for p in product(*arr)] 

len(y) 
# 81 

Пример с меньшим списком:

arr = [[1,2],[3,4],[5,6]] 
[sum(p) for p in product(*arr)] 
# [9, 10, 10, 11, 10, 11, 11, 12] 
+0

Спасибо, он не печатает индекс (строки, col) элементов, которые помогли при достижении этой суммы. Как я это сделаю? – vkb

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