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

时间:2018-10-07 04:51:43

标签: python numpy sparse-matrix

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

我想给出任何形状的矩阵(列,行,正方形,非正方形,简并的)。我将返回其上下左右翻转的版本。

由于np.flip对于一维数组有一些问题。我的方法是:

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

可以,但是可以接受吗?有更快的方法吗?

另一方面,如何处理稀疏矩阵(例如,如果Mscipy.sparse.csr_matrix

1 个答案:

答案 0 :(得分:2)

我们可以使用步长为-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上,这使我们可以为需要沿其翻转的轴指定一个整数元组。对于docs中带有axis=None的默认情况,它将沿所有轴翻转。因此,要解决我们的情况,将只是np.flip(a),它将再次覆盖泛型ndarray和稀疏矩阵。