Sto cercando di implementare una procedura di shuffling NaN-safe in Cython che può mescolare lungo diversi assi di una matrice multidimensionale di dimensione arbitraria.Mescolamento in loco di array multidimensionali
Nel caso semplice di una matrice 1D, si può semplicemente mescolare sopra tutti gli indici con non-NaN valori utilizzando l'algoritmo di 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]
Vorrei estendere questo algoritmo per gestire grandi multidimensionale array senza risagoma (che innesca una copia per casi più complicati non considerati qui). A tal fine, avrei bisogno di eliminare la dimensione di input fissa, che non sembra possibile con gli array numpy né con le visualizzazioni di memoria in Cython. C'è una soluzione?
Molte grazie in anticipo!
Quindi il problema è avere un numero arbitrario di dimensioni? – Veedrac
Quanti loop for-loop userete quando la dimensione dell'input è sconosciuta? –
@moarningsun è possibile utilizzare gli strides dell'array per scansionare la memoria lungo qualsiasi asse per un caso generale ... –