沿所有轴无缝高效地翻转 numpy 数组或稀疏矩阵

Seamlessly and efficiently flipping numpy array or sparse matrix along all axes

假设我们有一个未知形状的矩阵(numpy 数组),形状可以是例如 (1,5)(行)、(5,1)(列)、(5,5)(方形), (5,6)(非正方形)或 (5,)(退化)(好的,最后一种情况不是矩阵,而是有效输入)。

我想给出一个任意形状的矩阵(列、行、方形、非方形、退化)。我将 return 翻转 up/down left/right 版本。

因为 np.flip 一维数组存在一些问题。我的方法是:

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

它有效,但是可以接受吗?有什么更快的方法吗?

另一方面,我怎样才能对稀疏矩阵做同样的事情(例如,如果 Mscipy.sparse.csr_matrix)。

我们可以使用步长为 -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 and newer, that allows us to specify tuple of ints for the axes along which the flipping is needed. For the default case with axis=None from the docs,它沿所有轴翻转。因此,为了解决我们的问题,它只是 np.flip(a),这将再次涵盖通用 ndarrays 和稀疏矩阵。