Frage

Ich habe eine Zeit lang diese gesucht, im Grunde versuche ich, bedingt durch eine andere Liste, um eine Liste von Elemente zu erhöhen, elementweise ...

mein Code ist folgende, aber gibt es einen besseren Weg, es zu tun? Liste Verständnis, Karte ??

Ich denke, ein elementweise Operator wie ~ + = von http: // www .python.org / dev / pep / pep-0225 / wäre wirklich gut, aber warum verschoben wird?

for i in range(1,len(s)):
        if s[i]<s[0]:
            s[i]+=p[i]

basierend auf einige gute Feedbacks von euch habe ich auf die folgende umcodiert

i=s<s[0]
s[i]+=p[i]

und s, p sind beide Arrays.

P. S immer noch langsam als Matlab 5-mal für einen meines Code.

War es hilfreich?

Lösung

Wenn Sie nicht ein neues Array erstellen möchten, dann Ihre Optionen sind:

  1. Was Sie vorgeschlagen (obwohl Sie vielleicht xrange abhängig von der Python-Version verwenden)
  2. Verwenden Sie Numpy Arrays für s- und p. Dann können Sie so etwas wie s[s<s[0]] += p[s<s[0]] tun, wenn s und p die gleiche Länge haben.
  3. Verwenden Sie Cython zu beschleunigen, was Sie vorgeschlagen haben.

Andere Tipps

Hier ist eine kurze Version:

# sample data
s = [10, 5, 20]
p = [2,2,2]

# As a one-liner.  (You could factor out the lambda)
s = map(lambda (si, pi): si + pi if si < s[0] else si, zip(s,p))

# s is now [10, 7, 20]

Dies setzt voraus, dass len(s) <= len(p)

Hope, das hilft. Lassen Sie mich wissen . Viel Glück. : -)

Sehen Sie sich diese Frage SO:

Im Grunde so etwas wie:

[sum(a) for a in zip(*[s, p]) if a[0] < 0]

Beispiel:

>>> [sum(a) for a in zip(*[[1, 2, 3], [10, 20, 30]]) if a[0] > 2]
[33]

Um zu klären, hier ist was zip tut:

>>> zip(*[[1, 2, 3], [4, 5, 6]])
[(1, 4), (2, 5), (3, 6)]

Es verkettet zwei (oder mehr) Listen zu einer Liste von Tupeln. Sie können auf die Elemente von jedem der Tupeln für Bedingungen testen.

s = [s[i]+p[i]*(s[i]<s[0]) for i in range(1,len(s))]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top