Select 每个 numpy 行的不同切片
Select different slices from each numpy row
我有一个 3d 张量,我想 select 来自 dim=2 的不同切片。像 a[[0, 1], :, [slice(2, 4), slice(1, 3)]]
.
a=np.arange(2*3*5).reshape(2, 3, 5)
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]],
[[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29]]])
# then I want something like a[[0, 1], :, [slice(2, 4), slice(1, 3)]]
# that gives me np.stack([a[0, :, 2:4], a[1, :, 1:3]]) without a for loop
array([[[ 2, 3],
[ 7, 8],
[12, 13]],
[[16, 17],
[21, 22],
[26, 27]]])
而且我看过 但这不是我想要的。
您可以按照此处的说明使用 advanced indexing
。您必须传递在您的情况下为 [0, 1]
的行 ID 以及 2, 3
和 1, 2
的列 ID。这里2,3
表示[2:4]
,1, 2
表示[1:3]
import numpy as np
a=np.arange(2*3*5).reshape(2, 3, 5)
rows = np.array([[0], [1]], dtype=np.intp)
cols = np.array([[2, 3], [1, 2]], dtype=np.intp)
aa = np.stack(a[rows, :, cols]).swapaxes(1, 2)
# array([[[ 2, 3],
# [ 7, 8],
# [12, 13]],
# [[16, 17],
# [21, 22],
# [26, 27]]])
另一种避免 swapaxes
并以所需格式获得结果的等效方法是
aa = np.stack(a[rows, :, cols], axis=2).T
我想到的第三种方法是传递索引列表。这里[0, 0]
会对应[2,3]
,[1, 1]
会对应[1, 2]
。 swapaxes
只是为了得到你想要的输出格式
a[[[0,0], [1,1]], :, [[2,3], [1,2]]].swapaxes(1,2)
一个解决方案...
import numpy as np
a = np.arange(2*3*5).reshape(2, 3, 5)
np.array([a[0,:,2:4], a[1,:,1:3]])
我有一个 3d 张量,我想 select 来自 dim=2 的不同切片。像 a[[0, 1], :, [slice(2, 4), slice(1, 3)]]
.
a=np.arange(2*3*5).reshape(2, 3, 5)
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]],
[[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29]]])
# then I want something like a[[0, 1], :, [slice(2, 4), slice(1, 3)]]
# that gives me np.stack([a[0, :, 2:4], a[1, :, 1:3]]) without a for loop
array([[[ 2, 3],
[ 7, 8],
[12, 13]],
[[16, 17],
[21, 22],
[26, 27]]])
而且我看过
您可以按照此处的说明使用 advanced indexing
。您必须传递在您的情况下为 [0, 1]
的行 ID 以及 2, 3
和 1, 2
的列 ID。这里2,3
表示[2:4]
,1, 2
表示[1:3]
import numpy as np
a=np.arange(2*3*5).reshape(2, 3, 5)
rows = np.array([[0], [1]], dtype=np.intp)
cols = np.array([[2, 3], [1, 2]], dtype=np.intp)
aa = np.stack(a[rows, :, cols]).swapaxes(1, 2)
# array([[[ 2, 3],
# [ 7, 8],
# [12, 13]],
# [[16, 17],
# [21, 22],
# [26, 27]]])
另一种避免 swapaxes
并以所需格式获得结果的等效方法是
aa = np.stack(a[rows, :, cols], axis=2).T
我想到的第三种方法是传递索引列表。这里[0, 0]
会对应[2,3]
,[1, 1]
会对应[1, 2]
。 swapaxes
只是为了得到你想要的输出格式
a[[[0,0], [1,1]], :, [[2,3], [1,2]]].swapaxes(1,2)
一个解决方案...
import numpy as np
a = np.arange(2*3*5).reshape(2, 3, 5)
np.array([a[0,:,2:4], a[1,:,1:3]])