假设我们有一个形状未知的矩阵(numpy数组),形状可以是(1,5)
(行),(5,1)
(列),(5,5)
(正方形), (5,6)
(非正方形)或(5,)
(退化)(确定最后一种情况不是矩阵,而是有效输入)。
我想给出任何形状的矩阵(列,行,正方形,非正方形,简并的)。我将返回其上下左右翻转的版本。
由于np.flip
对于一维数组有一些问题。我的方法是:
def flipit(M):
return M.ravel()[::-1].reshape(M.shape)
可以,但是可以接受吗?有更快的方法吗?
另一方面,如何处理稀疏矩阵(例如,如果M
是scipy.sparse.csr_matrix
)
答案 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和稀疏矩阵。