2013-10-02 22 views
5

Say Mam tablicę wartości:Numpy - dane grupy do sumy wartości

a = np.array([1,5,4,2,4,3,1,2,4]) 

i trzy wartości 'sum':

b = 10 
c = 9 
d = 7 

czy istnieje sposób do grupy wartości w a język grupy zbiorów, w których wartości łączą się równe b, cid? Na przykład:

b: [5,2,3] 
c: [4,4,1] 
d: [4,2,1] 

b: [5,4,1] 
c: [2,4,3] 
d: [4,2,1] 

b: [4,2,4] 
c: [5,4] 
d: [1,1,2,3] 

Uwaga suma b, c i d powinny pozostać takie same (== 26). Być może ta operacja ma już nazwę?

+6

Wygląda na to, że próbujesz rozwiązać problem "plecaka" (lub jego wariantu): http://en.wikipedia.org/wiki/Knapsack_problem –

+3

Podobny tak, nazwałbym to "plecakiem wielokrotnym" problem". Na przykład. Na ile sposobów możesz spakować swoje rzeczy w trzy plecaki (gdzie koszt nie jest problemem). – atomh33ls

+3

Jest to więc problem z wyszukiwaniem, a nie numeryczny (numpy). I tak jak w przypadku większości problemów z wyszukiwaniem, istnieje rozwiązanie brutalnej siły i różne strategie (często heurystyczne) do przycinania gałęzi deadend. – hpaulj

Odpowiedz

2

Oto naiwna implementacja wykorzystujące itertools

from itertools import chain, combinations 

def group(n, iterable): 
    s = list(iterable) 
    return [c for c in chain.from_iterable(combinations(s, r) 
              for r in range(len(s)+1)) 
      if sum(c) == n] 

group(5, range(5)) 

plony

[(1, 4), (2, 3), (0, 1, 4), (0, 2, 3)] 

Uwaga, to prawdopodobnie będzie bardzo powolne dla dużych list ponieważ jesteśmy zasadniczo konstruowania i filtrowanie przez zestaw mocy tej listy.


Można to wykorzystać do

sum_vals = [10, 9, 7] 
a = [1, 5, 4, 2, 4, 3, 1, 2, 4] 

map(lambda x: group(x, a), sum_vals) 

a następnie zip je razem.

+3

To nie spełnia warunku niejawnego, że każda wartość w "a" może być umieszczona tylko w jednej grupie. – askewchan

+0

@askewchan, masz rację. Ale myślę, że to może być dobry punkt wyjścia. Bawiłem się przy użyciu 'np.unique (group (b, a))' a następnie jakoś przycinałem po testowaniu wyjściami z 'group (c, a)' oraz 'group (d, a)'. Jeszcze się nie udało. – atomh33ls

+0

Tak, brakuje tylko filtra na końcu, który sprawdza, czy te dwie kolekcje są równe. 'np.unique' nie jest wystarczający, ponieważ przy zamówieniu nie ma znaczenia, liczy się każdy wpis. Można porównać ich "bincount". – askewchan

Powiązane problemy