假设我们有一个未知形状的矩阵(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
)。
最佳答案
我们可以使用步长为 -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 和稀疏矩阵。
关于python - 沿所有轴无缝高效地翻转 numpy 数组或稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685560/