Überspringen Sie jedes N-TEN index von numpy array

Damit zu tun K-fache Validierung würde ich gerne verwenden, schneiden Sie ein numpy-array, so dass ein Blick auf das original-array wird, sondern mit jeder x-te element entfernt.

Beispielsweise: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Wenn n = 4 dann das Ergebnis sein würde [1, 2, 4, 5, 6, 8, 9]

Hinweis: die numpy-Anforderung ist aufgrund dieser für ein machine-learning-Zuordnung, wo die Abhängigkeiten sind behoben.

  • Für die use-cases der cross-Validierung dieses Ansatz sieht beängstigend aus. Es gibt einige versteckte Annahmen, die dann über die Reihenfolge der Daten. Ich würde lieber ein paar shuffle/random_permutation basierten Ansatz im Allgemeinen, aber auch stick -, um die verfügbaren Funktionen in scikit-learn, da gibt es noch mehr powerfull stuff wie geschichtete Stichproben (wenn nötig). Seite-Hinweis: reinigen Sie Ihre tags als fold (funktionale Programmierung) und k (Programmier-Sprache) sind einfach falsch.
  • Ich Stimme mit sascha. Insbesondere, nehmen Sie einen Blick auf die cross-validation-Iteratoren. scikit-learn.org/stable/modules/…
  • Ich bin damit einverstanden, dass mit Hilfe einer vorhandenen Bibliothek wäre aber besser, ich sollte erwähnt haben, dass ich nur numpy als Abhängigkeit, da dies für eine Maschine-learning-Zuordnung sorry! Um das zu erreichen Zufälligkeit bin ich schlurfte die Zeilen mit np.random.shuffle.
  • Ich verstehe. Aber nach dem mischen es spielt keine Rolle, wenn Sie nehmen Sie alle 4-TEN oder die ersten N/4 Werte. Letzteres könnte einfacher zu implementieren.
InformationsquelleAutor Ben Hazelwood | 2016-12-02



2 Replies
  1. 9

    Ansatz #1 mit modulus

    a[np.mod(np.arange(a.size),4)!=0]

    Probe Gefahren –

    In [255]: a
    Out[255]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [256]: a[np.mod(np.arange(a.size),4)!=0]
    Out[256]: array([1, 2, 3, 5, 6, 7, 9])

    Ansatz #2 mit masking : – Anforderung als view

    Angesichts der Aussicht auf Anforderung, wenn die Idee ist, um Speicher zu sparen, könnten wir speichern die gleichwertige boolean-array, das belegen würde 8 mal weniger Speicher auf dem Linux-system. So, wie eine Maske basierte Ansatz wäre, wie so

    # Create mask
    mask = np.ones(a.size, dtype=bool)
    mask[::4] = 0

    Hier ist die Anforderung an den Speicher stat –

    In [311]: mask.itemsize
    Out[311]: 1
    
    In [312]: a.itemsize
    Out[312]: 8

    Dann könnten wir das boolean-Indizierung, als Sicht –

    In [313]: a
    Out[313]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [314]: a[mask] = 10
    
    In [315]: a
    Out[315]: array([ 0, 10, 10, 10,  4, 10, 10, 10,  8, 10])

    Ansatz #3 mit NumPy array strides : – Anforderung als view

    Können Sie np.lib.stride_tricks.as_strided zu dieser Ansicht angesichts der Länge der Eingabe-array ist ein Vielfaches von n. Wenn es nicht ein mehrfaches, es würde noch funktionieren, aber nicht eine sichere Praxis, als würden wir über das hinausgehen, Speicher für Eingabe-array. Bitte beachten Sie, dass die Ansicht so angelegt wäre 2D.

    So, eine Implementierung zu bekommen, wie ein Blick wäre –

    def skipped_view(a, n):
        s = a.strides[0]
        strided = np.lib.stride_tricks.as_strided
        return strided(a,shape=((a.size+n-1)//n,n),strides=(n*s,s))[:,1:]

    Probe Gefahren –

    In [50]: a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) # Input array
    
    In [51]: a_out = skipped_view(a, 4)
    
    In [52]: a_out
    Out[52]: 
    array([[ 1,  2,  3],
           [ 5,  6,  7],
           [ 9, 10, 11]])
    
    In [53]: a_out[:] = 100 # Let's prove output is a view indeed
    
    In [54]: a
    Out[54]: array([  0, 100, 100, 100,   4, 100, 100, 100,   8, 100, 100, 100])
    • Super Antwort, danke @Divakar #2 sieht aus wie die beste Lösung für mich
    • Ich würde Zustimmen, dass die Werke als eine generische Lösung.
  2. 2

    numpy.löschen :

    In [18]: arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
    
    In [19]: arr = np.delete(arr, np.arange(0, arr.size, 4))
    
    In [20]: arr
    Out[20]: array([1, 2, 3, 5, 6, 7, 9])
    • Das sieht nicht aus wie ein anzeigen.
    • Ich Stimme mit @sascha, wenn eine weitere Speicher-effizienter Ansatz existiert, wäre es besser

Schreibe einen Kommentar

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