结合numpys花式索引和切片

2024-05-16 06:52:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有一个形状为(m, n)的二维numpy数组。此外,我有两个(m, p)索引数组i1i2。索引总是连续的!你知道吗

import numpy as np
t = np.array([[-1, -1,  0,  0,  1,  2,  2],
              [-1, -1,  0,  1,  2,  3,  3],
              [0,  0,  1,  2,  2,  3,  3]])

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

如何使用数组i1i2t进行切片以获得以下子矩阵?你知道吗

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

就是这样

expected_t[0, :] = t[0, i1[0]:i2[0]]
expected_t[1, :] = t[1, i1[1]:i2[1]]
expected_t[2, :] = t[2, i1[2]:i2[2]]

此外,这是否可以在不通过创建视图复制数据的情况下实现?你知道吗

提前感谢大家的帮助!你知道吗


Tags: 数据importnumpy视图asnp情况切片
1条回答
网友
1楼 · 发布于 2024-05-16 06:52:45

我建议这样做,但我不知道是否有一种最快的索引方法,如下示例:

import numpy as np
t = np.array([[-1, -1,  0,  0,  1,  2,  2],
              [-1, -1,  0,  1,  2,  3,  3],
              [0,  0,  1,  2,  2,  3,  3]])

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

output = [] 
for i, (min_, max_) in enumerate(zip(i1, i2)):
    output.append(t[i, min_:max_+1])

expected_t = np.array(output)

或更短:

expected_t = np.array([t[i, j:k+1] for (i,j,k) in zip(range(len(t)), i1, i2)])

相关问题 更多 >