在 Python 中,是否可以在没有 for 循环的情况下一次性 return 多个 3D 数组切片?

In Python, is it possible to return multiple 3D array slices all at once without a for loop?

这是示例代码。我想找到一次 运行 最后两行和 return 同一数组中的结果而不串联的方法,这可能吗?

import numpy as np
arr = np.ones((3,3,3))
arr[0:2,0:2,0:2]
arr[1:3,1:3,1:3]

生成的命令应该是这样的

arr[(0:1,2:3),(0:1,2:3),(0:1,2:3)]

结果的维度将为 (2,2,2,2)。

你的数组和切片:

In [128]: arr = np.arange(27).reshape(3,3,3)
In [129]: a1=arr[0:2,0:2,0:2]
     ...: a2=arr[1:3,1:3,1:3]
In [130]: a1.shape
Out[130]: (2, 2, 2)
In [131]: a2.shape
Out[131]: (2, 2, 2)

a1a2views,与 arr.

共享数据缓冲区

加入他们的新维度(np.stack 也会这样做):

In [132]: a3 = np.array((a1,a2))
In [133]: a3.shape
Out[133]: (2, 2, 2, 2)
In [134]: a3
Out[134]: 
array([[[[ 0,  1],
         [ 3,  4]],

        [[ 9, 10],
         [12, 13]]],


       [[[13, 14],
         [16, 17]],

        [[22, 23],
         [25, 26]]]])

注意扁平化的值是如何不连续的(或其他规则模式)。所以他们必须要某种副本:

In [135]: a3.ravel()
Out[135]: array([ 0,  1,  3,  4,  9, 10, 12, 13, 13, 14, 16, 17, 22, 23, 25, 26])

另一种方法是构建索引,连接它们,然后进行一次索引。那次差不多。在这种情况下,我认为这会更复杂。

===

stride_tricks 的另一种方式。我不会保证速度。

In [147]: x = np.lib.stride_tricks.sliding_window_view(arr,(2,2,2))
In [148]: x.shape
Out[148]: (2, 2, 2, 2, 2, 2)
In [149]: x[0,0,0]
Out[149]: 
array([[[ 0,  1],
        [ 3,  4]],

       [[ 9, 10],
        [12, 13]]])
In [150]: x[1,1,1]
Out[150]: 
array([[[13, 14],
        [16, 17]],

       [[22, 23],
        [25, 26]]])
In [151]: x[[0,1],[0,1],[0,1]]
Out[151]: 
array([[[[ 0,  1],
         [ 3,  4]],

        [[ 9, 10],
         [12, 13]]],


       [[[13, 14],
         [16, 17]],

        [[22, 23],
         [25, 26]]]])