Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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切片函数:从阵列形状(X,2)中动态创建切片索引np.r_u[a:b,c:d,…],以便在阵列中进行选择 形势_Python_Arrays_Python 3.x_Numpy_Slice - Fatal编程技术网

Python Numpy切片函数:从阵列形状(X,2)中动态创建切片索引np.r_u[a:b,c:d,…],以便在阵列中进行选择 形势

Python Numpy切片函数:从阵列形状(X,2)中动态创建切片索引np.r_u[a:b,c:d,…],以便在阵列中进行选择 形势,python,arrays,python-3.x,numpy,slice,Python,Arrays,Python 3.x,Numpy,Slice,我有代表双声道音频的2D阵列。我想创建一个函数,该函数在任意位置(例如,仅语音部分)返回此数组的切片。我已经知道如何将值显式写入np.r\中: 样本数据 arr=np.arange0,24.e2,-1 数组[[0,1,2,3,4,5,6,7,8,9,10,11], [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]] 输入 宽度为2的x长度数组。例如 选择器=np.数组[[0,2],[6,9]] 数组[[0,2], [6, 9]] 期望输出 创建索引

我有代表双声道音频的2D阵列。我想创建一个函数,该函数在任意位置(例如,仅语音部分)返回此数组的切片。我已经知道如何将值显式写入np.r\中:

样本数据 arr=np.arange0,24.e2,-1 数组[[0,1,2,3,4,5,6,7,8,9,10,11], [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]] 输入 宽度为2的x长度数组。例如

选择器=np.数组[[0,2],[6,9]] 数组[[0,2], [6, 9]] 期望输出 创建索引数组 选择指数=np.r[0:2,6:9] 数组[0,1,6,7,8] 使用索引选择2D arr[:,选择指数] 数组[[0,1,6,7,8], [12, 13, 18, 19, 20]] 球门 一个函数,它采用宽度为2的X长数组形状:X,2,表示切片的开始和结束,并使用该数组返回数组的选择。实际上,np.r_u2;[0:2,6:9],但从一个参数开始

arr=np.arange0,24.e2,-1 def切片返回器,选择器: 像这样的东西坏了;应该是这样的:np.r_[0:2,6:9] 选择\u索引=np.r\u[[行[0]:行[1]]用于选择器中的行] 返回二维切片 返回arr[:,选择索引] 选择器=np.数组[[0,2],[6,9]] 已切片的\u arr=切片返回器arr,选择器
如何将输入转换为选择切片?最好使用最少的数组创建/复制。

您可以从单个数组创建索引数组

slices = [[0, 2], [6, 9]]
np.concatenate([np.arange(*i) for i in slices])
# array([0, 1, 6, 7, 8])
并使用它来提取数据

arr[:, np.concatenate([np.arange(*i) for i in slices])]
# array([[ 0,  1,  6,  7,  8],
#        [12, 13, 18, 19, 20]])

我认为布尔索引可能是一种有效的方法。因此,我们可以创建一个掩码,然后索引col并获得输出-

# Generate mask for cols
mask = np.zeros(arr.shape[1],dtype=bool)
for (i,j) in selector:
    mask[i:j] = True

# Boolean index into cols for final o/p
out = arr[:,mask]
内存开销只是掩码,它是一个布尔数组,应该是最小的,最终的输出也是必需的

矢量化遮罩创建

如果选择器中有许多条目,则有一种基于广播的矢量化方法来创建COL的掩码,如下所示-

r = np.arange(arr.shape[1])
mask = ((selector[:,0,None]<=r) & (selector[:,1,None]>r)).any(0)

这实际上比我的解决方案要好。@NilsWerner是的,最初我是使用这种连接方法的,但最终所需的输出使我改变了主意。