Ich versuche, ein NaN-sicheres Shuffling-Verfahren in Cython zu implementieren, das entlang mehrerer Achsen einer mehrdimensionalen Matrix beliebiger Dimension mische.In-Place-Shuffling von mehrdimensionalen Arrays
Im einfachen Fall einer 1D-Matrix kann man einfach alle Indizes mit nicht-NaN Shuffle über Werte, die Fisher-Yates-Algorithmus:
def shuffle1D(np.ndarray[double, ndim=1] x):
cdef np.ndarray[long, ndim=1] idx = np.where(~np.isnan(x))[0]
cdef unsigned int i,j,n,m
randint = np.random.randint
for i in xrange(len(idx)-1, 0, -1):
j = randint(i+1)
n,m = idx[i], idx[j]
x[n], x[m] = x[m], x[n]
Ich möchte diesen Algorithmus erweitern multidimensional zu handhaben große Arrays ohne Umformung (wodurch eine Kopie für kompliziertere Fälle ausgelöst wird, die hier nicht berücksichtigt werden). Zu diesem Zweck müsste ich die feste Eingabedimension loswerden, die mit numpy arrays oder Memoryviews in Cython nicht möglich ist. Gibt es eine Problemumgehung?
Vielen Dank im Voraus!
So ist das Problem nur mit einer beliebigen Anzahl von Dimensionen? – Veedrac
Wie viele for-Schleifen verwenden Sie, wenn die Dimension der Eingabe unbekannt ist? –
@moarningsun ist es möglich, die Array-Schritte zu verwenden, um den Speicher entlang einer beliebigen Achse für einen allgemeinen Fall zu scannen ... –