Wie führen eine operation auf jedes element in ein numpy matrix?

Sagen, dass ich eine Funktion foo (), die in einem single-float und gibt eine einzelne Schwimmer. Was ist der Schnellste/die meisten pythonic Weg, um die Anwendung dieser Funktion auf jedes element in ein numpy matrix-oder array?

Was ich im wesentlichen brauchen, ist eine version von diesem code, der nicht mit einer Schleife:

import numpy as np

big_matrix = np.matrix(np.ones((1000, 1000)))

for i in xrange(np.shape(big_matrix)[0]):

    for j in xrange(np.shape(big_matrix)[1]):

        big_matrix[i, j] = foo(big_matrix[i, j])

War ich versucht, etwas zu finden in der numpy-Dokumentation, die es mir ermöglichen, dies zu tun, aber ich habe nicht gefunden was.

Edit: Wie ich bereits erwähnt in den Kommentaren, speziell die Funktion, die ich brauche, um zu arbeiten, ist die sigmoid-Funktion, f(z) = 1 /(1 + exp(-z)).

  • Stimmen, die Vektorisierung ist die Antwort. Sie möchten zu überdenken, welche Funktion foo() funktioniert, momentan funktioniert es auf den einzelnen Elementen. Vektorisierung bedeutet, dass Betriebssystem auf ganze Zeilen/Spalten auf einmal so entfernen Sie die Schleife.
  • np.vectorize ist definitiv die „pythonic“ im Allgemeinen Fall. Aber für bestimmte Funktionen foo Sie vielleicht in der Lage, besser zu tun, nicht mit eine Funktion auf alle und sich auf die numpy Vektor-Operationen (seit np.vectorize nicht wirklich alles tun, um die Berechnung schneller).
  • Ich bin speziell auf der Suche, um die Verwendung der sigmoid-Funktion, D. H. f(z) = 1 / (1 + exp(-z))
  • ersetzen exp(-z) mit np.exp(-z) und Ihre Funktion wird vektorisiert. Dann kann es eine np.array als Eingabe und Rückkehr die richtige Antwort.
  • stackoverflow.com/questions/7701429/… ist nicht eine gute doppelte. Alle, die es vorschlägt, ist np.vectorize die loops. Es gibt bessere Antworten in den Kommentaren.
InformationsquelleAutor ClydeTheGhost | 2016-07-26



One Reply
  1. 3

    Wenn foo ist wirklich eine black-box, nimmt ein Skalar, und liefert einen Skalar, dann müssen Sie irgendeine Art von iteration. Die Menschen versuchen oft np.vectorize und erkennen, dass, wie dokumentiert, ist es nicht die Sache beschleunigen viel. Es ist äußerst wichtig, als eine Möglichkeit des Rundfunk-und mehrere Eingänge. Es nutzt np.frompyfunc, die ist etwas schneller, aber mit weniger bequeme Schnittstelle.

    Den richtigen numpy Weise ändern Sie Ihre Funktion, so dass es funktioniert mit arrays. Das sollte nicht schwer zu tun, mit der Funktion, Ihre Kommentare

    f(z) = 1 / (1 + exp(-z))

    Gibt es eine np.exp Funktion. Der rest ist einfache Mathematik.

    • Deshalb akzeptiert, weil es Antworten zu meinem eigentlichen Problem. Ich habe geändert meine Frage, um diese zu reflektieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.