我有一个NumPy数组,如下所示:
arr = np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]])
我正在寻找这样的安排:
[[[6,[1,5]],[[11,10]],[[16,20],15]]]
因此本质上是一个3D阵列,阵列的每一行都有2×5.
我试过的代码是:
x=np.zeros([3,5])
for i in range(len(arr)):
x[i]=arr[i:i+2,:][::-1]
但这导致以下输出:
[[[ 6. 7. 8. 9. 10.]
[ 1. 2. 3. 4. 5.]]
[[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]
[[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]]
[[[ 6. 7. 8. 9. 10.]
[ 1. 2. 3. 4. 5.]]
[[11. 12. 13. 14. 15.]
[ 6. 7. 8. 9. 10.]]
[[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]]
[[[ 6. 7. 8. 9. 10.]
[ 1. 2. 3. 4. 5.]]
[[11. 12. 13. 14. 15.]
[ 6. 7. 8. 9. 10.]]
[[16. 17. 18. 19. 20.]
[11. 12. 13. 14. 15.]]]
最佳答案
我们可以利用基于
np.lib.stride_tricks.as_strided
的scikit-image's view_as_windows
来获取滑动窗口. More info on use of as_strided
based view_as_windows
.
from skimage.util.shape import view_as_windows
x = view_as_windows(arr,(2,arr.shape[1]))[:,::-1]
这只是输入数组的视图.因此,没有额外的内存开销和几乎免费的运行时.如果要使用自己的内存空间进行输出,请在其中附加.copy(),即x.copy().
样品运行-
In [15]: from skimage.util.shape import view_as_windows
In [16]: view_as_windows(arr,::-1]
Out[16]:
array([[[ 6,[ 1,[ 6,15]]])