将numpys花式索引与切片相结合

时间:2018-10-12 14:04:47

标签: python numpy matrix-indexing

我目前有一个形状为(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])

如何使用数组i1i2来切片t以获得以下子矩阵?

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]]

此外,是否可以通过创建视图而无需复制数据来做到这一点?

预先感谢所有帮助!

1 个答案:

答案 0 :(得分:0)

我建议这样做,但是我不知道它是否存在按照示例进行索引的最快方法:

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)])