Python 在多维numpy数组的每个索引处切片不同的范围
我有一个Python 在多维numpy数组的每个索引处切片不同的范围,python,arrays,numpy,slice,Python,Arrays,Numpy,Slice,我有一个mxnnumpy数组arr,对于arr的每一列,我都有一个给定的要访问的行范围。 我有一个nx1arrayvec,它描述了这个范围何时开始。 该范围有一些恒定的持续时间d 如何有效地提取感兴趣的dxn数组? 这可以通过巧妙的切片来实现吗 我最初的想法是尝试以下方式: arr = np.tile(np.arange(10),(4,1)).T vec = np.array([3,4,5,4]) d = 3 vec_2 = vec+d out = arr[vec:vec2,np.arange(
m
xn
numpy数组arr
,对于arr
的每一列,我都有一个给定的要访问的行范围。我有一个
n
x1
arrayvec
,它描述了这个范围何时开始。该范围有一些恒定的持续时间
d
如何有效地提取感兴趣的d
xn
数组?这可以通过巧妙的切片来实现吗 我最初的想法是尝试以下方式:
arr = np.tile(np.arange(10),(4,1)).T
vec = np.array([3,4,5,4])
d = 3
vec_2 = vec+d
out = arr[vec:vec2,np.arange(n)]
但这会产生以下错误:
TypeError:只能将整数标量数组转换为标量索引
所需的输出将是以下阵列:
array([[3, 4, 5, 4],
[4, 5, 6, 5],
[5, 6, 7, 6],
[6, 7, 8, 7])
我可以循环使用d
,但是性能对于这段代码很重要,所以我更愿意将其矢量化
In [489]: arr=np.arange(24).reshape(6,4)
In [490]: vec=np.array([0,2,1,3])
利用最近扩展的linspace
生成多个阵列:
In [493]: x = np.linspace(vec,vec+2,3).astype(int)
In [494]: x
Out[494]:
array([[0, 2, 1, 3],
[1, 3, 2, 4],
[2, 4, 3, 5]])
In [495]: arr[x, np.arange(4)]
Out[495]:
array([[ 0, 9, 6, 15],
[ 4, 13, 10, 19],
[ 8, 17, 14, 23]])
列迭代法:
In [498]: np.stack([arr[i:j,k] for k,(i,j) in enumerate(zip(vec,vec+3))],1)
Out[498]:
array([[ 0, 9, 6, 15],
[ 4, 13, 10, 19],
[ 8, 17, 14, 23]])
请提供答案。在链接问答的接受答案中,使用您的起始索引代替
idx
。使用arr
的转置版本作为输入。