9
votes

Équivalent à la méthode SEQ.Scan () de F # en Python?

y a-t-il une fonction comme un SEQ.SCAN () en python?

Je veux faire du cumsum () ou cumproduct () genre de choses sans boucle.


1 commentaires

Scan (opérateur.add, [1,2,3,4]) == [1,3,6,10] . Pas mappe ou Réduire .


6 Réponses :




5
votes

Nope.

def scan(op, seq):
  it = iter(seq)
  result = next(it)
  for val in it:
    result = op(result, val)
    yield result


3 commentaires

Vous devriez faire un résultat de rendement avant la boucle, sinon le résultat manquera le premier élément.


Ouais, les documents MS étaient un peu vagues quant à ce que SEQ.SCAN <> () a fait .


Thnx. En fait, F # SEQ.SCAN () nécessite un autre paramètre d'état initial (résultat) .. Thnx.



6
votes

La solution de Ignacio est presque correcte, je pense que, mais nécessite un opérateur de type ('A ->' A -> 'A) et ne donne pas le premier élément.

('State -> 'State -> 'State) -> seq<'State> -> seq<'State>


1 commentaires

+1, mais je céderais avant d'appliquer la première réduction. Je ne sais pas à propos de la numérisation F # ', mais Haskell renvoie l'état initial comme premier élément (qui a beaucoup de sens): scanl (+) 0 [1,2,3] # [0,1,3,6 ].



2
votes

S'il s'agit uniquement de faire des opérations Cumsum / Cumprod, vous devriez alors regarder le super efficace de Numpy Cumsum et Cumprod Opérations sur les tableaux.


0 commentaires

0
votes

Vous pouvez utiliser une fonction d'accumulation obtenir la même fonctionnalité d'équivalent python pour numériser: xxx pré>

Vous pouvez également utiliser RX (extension réactive) pour utiliser l'opérateur de numérisation. C'est une bibliothèque externe. Vous devez donc l'installer avant de l'utiliser. Avec RX, vous pouvez faire quelque chose comme ceci: P>

from rx import  from_, operators as op
nums=[1,2,3,4,5]
source=from_(nums).pipe(op.scan(lambda x,y:x+y))
source.subscribe(lambda num:print(num)

#prints
#1
#3
#6
#10
#15


0 commentaires