簡體   English   中英

從每個numpy行中選擇不同的切片

[英]Select different slices from each numpy row

我有一個3d張量,我想從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以及列ID 2, 31, 2 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]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM