python - 如何有效地将阵列旋转±180°?

标签 python optimization

对于 C 语言和衍生产品(Python、Cython、纯 C),使用最少的内存和操作将非方形 M×N 数组绕其中心旋转 180° 的最佳算法是什么?

最佳答案

假设outarray的初始化副本,MN它们的行数和列数,并且我们使用从 0 到 (M-1) 和 (N-1) 索引数组的语言:

在Python中:

def rotate_180(array, M, N, out):
    for i in range(M):
        for j in range(N):
            out[i, N-1-j] = array[M-1-i, j]

在 4000×3000 阵列上这需要 5.82 秒。

使用 Memviews 并行化 Cython + OpenMP :

cdef void rotate_180(float[:, :] array, int M, int N, float[:, :] out) nogil:

    cdef size_t i, j

    with parallel(num_threads=8):
        for i in prange(M):
            for j in range(N):
                out[i, N-1-j] = array[M-1-i, j]

在 4000×3000 阵列上这需要 5.45 秒。

相比之下,带有 np.rot90(array, 2) 的 numpy 需要 8.58 µs。

编辑:为了避免万事通评论脱离要点,它的作用如下:

a = array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])

rotate_180(a, 3, 3, b)

b = array([[9, 8, 7],
           [6, 5, 4],
           [3, 2, 1]])

使用 numpy 内置函数连续 2 次 90° 旋转,我们得到:

np.rot90(a, 2)

out = array([[9, 8, 7],
             [6, 5, 4],
             [3, 2, 1]])

所以这个rotate_180()确实是180°旋转。现在:

np.flip(a, 0)

out = array([[7, 8, 9],
             [4, 5, 6],
             [1, 2, 3]])

不是旋转,而是沿最后一行对称。如果我们沿每个方向组成 2 个对称:

np.flip(np.flip(a, 1), 0)

out = array([[9, 8, 7],
             [6, 5, 4],
             [3, 2, 1]])

我们还得到了 180° 旋转。

所以,是的,谢谢,我的代码按照它的说明执行。

关于python - 如何有效地将阵列旋转±180°?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930428/

相关文章:

python - 将 Keras 与 Spearmint 集成的问题

python - 尽管该命令在终端上有效,但子进程未运行生成的命令

java - Java中for循环的不同执行时间

python - Selenium 错误 : element not visible (different behaviour on two computers)

python - 为 conda 安装 pip3

java - 在 Java 中哪个更快,而使用递归方法?

algorithm - 这个组合优化问题是 NP 难的吗?

java - 连接返回许多部分重复项的高效 Hibernate 标准

python - 在 Python 程序中嵌入 Web 浏览器

python - Pandas 将两个表中的数据转换为第三个表。交叉引用并将唯一行转换为列