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

标签 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 的切片表示法来表示输入中要沿所有轴翻转的暗淡数量,因为这就是原始代码本质上所做的事情。这将涵盖数组和稀疏矩阵 -

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 ,这允许我们为需要翻转的轴指定整数元组。对于 docsaxis=None 的默认情况,它沿所有轴翻转。因此,为了解决我们的情况,只需使用 np.flip(a) 即可,这将再次涵盖通用 ndarray 和稀疏矩阵。

关于python - 沿所有轴无缝高效地翻转 numpy 数组或稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685560/

相关文章:

Python NetworkX 增加圆形图的大小

python - 为什么 `for` 在 Python 列表上比在 Numpy 数组上更快?

cluster-analysis - 对二进制向量的稀疏数据集进行聚类

python - 在python中乘以大型稀疏矩阵

python - 尝试在 python 中实现简单的 BFS...如果搜索成功则无法打印值

python - Unicode解码错误: 'utf-8' codec can't decode byte 0x9d in position 0: invalid start byte when I execute the ` b.decode()`

python - Python 中大型 NumPy 数组的最小值、最大值和平均值

python - Numpy:向量化一个集成二维数组的函数

r - 如何将稀疏矩阵转化为H2O?

Python 语言检测 : choose between one language or the other only