这是使用
numpy
切片的简单方法。我个人认为它不会太难看,但同意
fliplr
更具描述性。
仅为了强调此示例对现有答案的贡献,我运行了相同的简单基准测试:
In [1]: import numpy as np
In [3]: X = np.random.randint(0, 10, (5, 5))
In [4]: X
Out[4]:
array([[7, 2, 7, 3, 7],
[8, 4, 5, 9, 6],
[0, 2, 9, 0, 4],
[8, 2, 1, 0, 3],
[3, 1, 0, 7, 0]])
In [5]: Y = X[:, ::-1]
In [6]: Z1 = np.diag(Y)
In [7]: Z1
Out[7]: array([7, 9, 9, 2, 3])
与最快替代方案的奇偶性比较:
In [8]: step = len(X) - 1
In [9]: Z2 = np.take(X, np.arange(step, X.size-1, step))
In [10]: Z2
Out[10]: array([7, 9, 9, 2, 3])
In [11]: np.array_equal(Z1, Z2)
Out[11]: True
基准测试
In [12]: %timeit np.diag(X[:, ::-1])
1.92 µs ± 29.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [13]: %timeit step = len(X) - 1; np.take(X, np.arange(step, X.size-1, step))
2.21 µs ± 246 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
初步比较表明,我的解决方案在复杂度上另外还是线性的,而使用第二个“步骤”解决方案则不是。
In [14]: big_X = np.random.randint(0, 10, (10000, 10000))
In [15]: %timeit np.diag(big_X[:, ::-1])
2.15 µs ± 96.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [16]: %timeit step = len(big_X) - 1; np.take(big_X, np.arange(step, big_X.size-1, step))
100 µs ± 1.85 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
我通常使用这种方法来翻转图像(镜像),或者在opencv
的格式(通道,高度,宽度)和matplotlib
的格式(高度,宽度,通道)之间进行转换。因此,对于一个三维图像,它只需flipped = image[:, :, ::-1]
。当然,您可以通过将::-1
部分放在所需的维度中来推广它以沿任何维度翻转。
step = len(array) - 1; np.take(array, np.arange(step, array.size, step))
- Jaimenp.arange(step, array.size-1, step)
?请将其发布为解决方案,以便我可以投票支持。 - unutbufliplr
的解决方案可能是最好的:足够快,并且在几个月后重新审视时更易于理解。 - Jaimenp.diag(arr[:, ::-1]
;) - 请看下面的答案! - n1k31t4