Плавное и эффективное перелистывание массива или разреженной матрицы по всем осям - PullRequest
0 голосов
/ 07 октября 2018

Скажем, у нас есть матрица (массив numpy) неизвестной формы, форма может быть, например, (1,5) (строка), (5,1) (столбец), (5,5) (квадрат), (5,6) (неквадрат) или (5,) (вырожденный) (хорошо, последний случай не является матрицей, но является допустимым вводом).

Я хотел бы дать матрицу любой формы (столбец, строка, квадрат, неквадратвыродились).Я верну перевернутую версию вверх / вниз влево / вправо.

Так как np.flip имеет некоторые проблемы с 1d массивами.Мой подход был:

def flipit(M):
    return M.ravel()[::-1].reshape(M.shape)

Это работает, но это приемлемо?Есть ли более быстрые способы сделать это?

С другой стороны, как я могу сделать то же самое для разреженных матриц (например, если M равно scipy.sparse.csr_matrix).

1 Ответ

0 голосов
/ 07 октября 2018

Мы можем использовать нотацию среза с размером шага -1 для количества тусклых точек на входе, чтобы переворачивать все оси, как это делает исходный код.Это будет охватывать как массивы, так и разреженные матрицы -

def flip_allaxes(a): # a can be array or sparse matrix
    # generate flipping slice
    sl = slice(None,None,-1) # or np.s_[::-1] suggested by @kmario23
    return a[tuple([sl]*a.ndim)]

Упрощено на более новых версиях NumPy (начиная с 15.1)

На более новых версиях NumPy: Version 15.1и более новый , который позволяет нам указать кортеж целых чисел для осей, вдоль которых необходимо переворачивание.Для случая по умолчанию с axis=None из docs он переворачивается по всем осям.Таким образом, для решения нашего случая это будет просто np.flip(a), и это снова будет охватывать как общие ndarrays, так и разреженные матрицы.

...