4 Stimmen

Erzeugen eines neu zugeordneten Numpy-Arrays als Ansicht.

Ein Spielzeugkoffer für mein Problem:

Ich habe ein Numpy-Array der Größe, sagen wir, 1000:

import numpy as np
a = np.arange(1000)

Ich habe auch ein "Projektionsfeld". p die eine Abbildung ist von a in ein anderes Array b :

p = np.random.randint(0,1000,(1000,1000))

Es ist leicht zu bekommen b de a mit "ausgefallener Indizierung":

b = a[p]

Aber b ist keine Ansicht, wie aus mehreren früheren Fragen/Antworten und der Numpy-Dokumentation hervorgeht.

Leider sind in meinem Fall nur die Werte in a Änderung im Verlauf einer langen Simulation und Verwendung einer ausgeklügelten Indexierung bei jeder Iteration, um b sehr kostspielig wird. Ich lese nur von b und ändern Sie sie nicht.

Soweit ich weiß, ist es (noch) nicht möglich, dieses Problem mit einer ausgeklügelten Indexierung zu lösen.

Ich habe mich gefragt, ob jemand ein ähnliches Problem/einen ähnlichen Engpass hatte und eine andere Lösung gefunden hat?

2voto

Bi Rico Punkte 24493

Was Sie verlangen, ist nicht praktikabel, und deshalb haben die Numpy-Leute es nicht implementiert. Sie könnten es selbst tun mit etwas wie:

class FancyView(object):
    def __init__(self, array, index):
        self._array = array
        self._index = index.copy()
    def __array__(self):
        return self._array[self._index]
    def __getitem__(self, index):
        return self._array[self._index[index]]

b = FancyView(a, p)

Aber beachten Sie, dass die teuren a[p] Operation wird jedes Mal aufgerufen, wenn Sie b als ein Array. Es gibt keinen anderen praktischen Weg, um eine solche "Ansicht" zu erstellen. Numpy kann mit der Verwendung von Views für das grundlegende Slicing auskommen, weil es die Strides manipulieren kann, aber es gibt keine Möglichkeit, so etwas mit Strides zu machen.

Wenn Sie nur Teile von b können Sie möglicherweise etwas Zeit sparen, indem Sie die ausgefallene Ansicht indizieren, anstatt sie als Array zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X