如何在 numpy 中使用高级索引从数组中复制/切片特定部分?

How can I copy/slice a particular part out of an array with advanced indexing in numpy?

提问人:Wolfsgrey 提问时间:3/30/2023 更新时间:3/30/2023 访问量:48

问:

我想复制一个数组的一部分,并使用numpy将其保存到另一个数组中。问题是,每行条目的数量和位置会发生变化。我有两个数组,其中包含要获取的行部分的开始索引和结束索引,但切片不会获取数组。

我试过:

import numpy as np

a = np.arange(25).reshape(5,5)

min_idx = np.array(
    [0, 1, 2, 1, 0]
)

max_idx = np.array(
    [4, 3, 3, 2, 2]
)

b = np.zeros_like(a)

b[:, min_idx:max_idx] = a[:,min_idx:max_idx]

并希望拥有 B:

target_b = np.array([
    [0, 1, 2, 3, 4],
    [0, 6, 7, 8, 0],
    [0, 0, 12, 13, 0],
    [0, 16, 17, 0, 0],
    [20, 21, 22, 0, 0]
    ]
)
python numpy 索引 切片

评论


答:

1赞 mozway 3/30/2023 #1

使用广播和面罩:

c = np.arange(a.shape[1])
m1 = min_idx[:, None] <= c
m2 = max_idx[:, None] >= c
m = m1&m2

b[m] = a[m]

b:

array([[ 0,  1,  2,  3,  4],
       [ 0,  6,  7,  8,  0],
       [ 0,  0, 12, 13,  0],
       [ 0, 16, 17,  0,  0],
       [20, 21, 22,  0,  0]])

评论

1赞 Chrysophylaxs 3/30/2023
最后一步也是可能的b = np.where(m1 & m2, a, 0)
1赞 mozway 3/30/2023
@Chrysophylaxs确实如此,我重用了 OP 的代码,但这是更干净;)