Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多维numpy数组的每个索引处切片不同的范围_Python_Arrays_Numpy_Slice - Fatal编程技术网

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
x
n
numpy数组
arr
,对于
arr
的每一列,我都有一个给定的要访问的行范围。
我有一个
n
x
1
array
vec
,它描述了这个范围何时开始。
该范围有一些恒定的持续时间
d

如何有效地提取感兴趣的
d
x
n
数组?
这可以通过巧妙的切片来实现吗

我最初的想法是尝试以下方式:

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
的转置版本作为输入。