沿所有轴无缝高效地翻转 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)
它有效,但是可以接受吗?有什么更快的方法吗?
另一方面,我怎样才能对稀疏矩阵做同样的事情(例如,如果 M
是 scipy.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 和稀疏矩阵。
假设我们有一个未知形状的矩阵(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)
它有效,但是可以接受吗?有什么更快的方法吗?
另一方面,我怎样才能对稀疏矩阵做同样的事情(例如,如果 M
是 scipy.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 和稀疏矩阵。