Próbuję zaimplementować procedurę losowania bezpieczną dla NaN w języku Cython, która może tasować wzdłuż kilku osi wielowymiarowej macierzy o dowolnym wymiarze.Szeregowanie tablic wielowymiarowych na miejscu
W prostym przypadku matrycy 1D, może po prostu losowo na wszystkie współczynniki o braku NaN wartości za pomocą algorytmu Fisher Yates:
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]
ja Aby rozszerzyć ten algorytm obsługiwać duże wielowymiarowy tablice bez zmiany kształtu (które uruchamiają kopię dla bardziej skomplikowanych przypadków, których tutaj nie uwzględniono). W tym celu musiałbym pozbyć się stałego wymiaru wejściowego, co nie wydaje się możliwe w przypadku numpy array ani memoryviews w Cython. Czy jest w pobliżu praca?
Wielkie dzięki z góry!
Czy problem dotyczy tylko dowolnej liczby wymiarów? – Veedrac
Ile pętli for-loop używasz, gdy wymiar wejścia jest nieznany? –
@możesz zauważyć, że możliwe jest użycie kroków tablicy w celu przeskanowania pamięci wzdłuż dowolnej osi dla ogólnego przypadku ... –