在 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)
a1
和 a2
是 views
,与 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]]]])
这是示例代码。我想找到一次 运行 最后两行和 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)
a1
和 a2
是 views
,与 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]]]])