Mam funkcję C, aby znormalizować wiersze tablicy w przestrzeni logu (to zapobiega niedomiarze liczbowym).Jak obliczyć tablicę ciągnącymi się w kolumnie przy rozszerzeniu numpy z C
Prototyp moim C-funkcji jest następująca:
void normalize_logspace_matrix(size_t nrow, size_t ncol, double* mat);
Widać, że ma wskaźnik do tablicy i modyfikuje go w miejscu. Kod C oczywiście zakłada, że dane są zapisywane jako tablica przylegająca do C, to znaczy sąsiadujące ze sobą.
ja owinąć funkcję w następujący sposób używając Cython (import i cdef extern from
pominięta):
def normalize_logspace(np.ndarray[np.double_t, ndim=2] mat):
cdef Py_ssize_t n, d
n = mat.shape[0]
d = mat.shape[1]
normalize_logspace_matrix(n, d, <double*> mat.data)
return mat
większość czasu NumPy-macierze są przyległe wierszy i funkcja działa poprawnie. Jeśli jednak tablica numpy została wcześniej transponowana, dane nie są kopiowane, ale zwracany jest tylko nowy widok danych. W tym przypadku moja funkcja nie działa, ponieważ tablica nie jest już ciągła w rzędzie.
mogę obejść ten problem, definiując tablicę mieć Fortran-ciągły porządek, tak, że po transpozycji będzie to C-Sąsiadujące:
A = np.array([some_func(d) for d in range(D)], order='F').T
A = normalize_logspace(A)
Oczywiście to jest bardzo podatne na błędy, a użytkownik musi podjąć dbamy o to, aby tablica była w poprawnej kolejności, czyli o czym nie powinien dbać użytkownik w Pythonie.
Jaki jest najlepszy sposób, w jaki mogę to zrobić z tablicami, które sąsiadują z wierszami i kolumnami? Zakładam, że w pewnym sensie sprawdzanie kolejności tablic w Cython jest drogą do zrobienia. Oczywiście wolałbym rozwiązanie, które nie wymaga kopiowania danych do nowej tablicy, ale prawie zakładam, że jest to konieczne.
Czy ta odpowiedź z 2010 roku jest wciąż aktualna, czy jest lepszy sposób na osiągnięcie tego teraz? –
@ larsmans: Nie wiem dokładnie, co masz na myśli przez "to".Pisanie funkcji C, która może obsłużyć zarówno dwuwymiarowe tablice sąsiadujące z Fortranem, jak i przylegające do C, nadal działa w ten sposób, jeśli tego właśnie chcesz. Jeśli jest dobrze, że twoje tablice zostaną skopiowane, istnieją (i były w 2010 roku) inne rozwiązania. –