我目前有一个形状为(m, n)
的二维numpy数组。此外,我有两个(m, p)
和两个索引i1
和i2
组成的数组。索引始终是连续的!
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])
如何使用数组i1
和i2
来切片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]]
此外,是否可以通过创建视图而无需复制数据来做到这一点?
预先感谢所有帮助!
答案 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)])