首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Numpy切片函数:动态创建切片索引np.r_[a:b,c:d,.]从数组形状(X,2)中选择数组

Numpy切片函数:动态创建切片索引np.r_[a:b,c:d,.]从数组形状(X,2)中选择数组
EN

Stack Overflow用户
提问于 2019-11-22 09:40:25
回答 2查看 486关注 0票数 4

形势

我有代表双声道音频的2D阵列。我想要创建一个函数,在任意位置(例如,只返回语音部分)返回这个数组的切片。当我显式地将值写入np.r_时,我已经知道了如何做到这一点。

样本数据

代码语言:javascript
运行
复制
arr = np.arange(0,24).reshape((2, -1))
# array([[ 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.g的x长数组。

代码语言:javascript
运行
复制
selector = np.array([[0, 2], [6, 9]])
# array([[0, 2],
#        [6, 9]])

期望输出

代码语言:javascript
运行
复制
# create an indexed arrays
selection_indices = np.r_[0:2, 6:9]
# array([0, 1, 6, 7, 8])

# use indices to select 2D
arr[:, selection_indices]
# array([[ 0,  1,  6,  7,  8],
#        [12, 13, 18, 19, 20]])

目标

一个函数,它采用宽度为2的X长数组(shape: X,2),表示片的开始和结束,并使用它返回数组的选择。有效的np.r_[0:2, 6:9],但然后从一个论点。

代码语言:javascript
运行
复制
arr = np.arange(0,24).reshape((2, -1))

def slice_returner(arr, selector):
    # something like this (broken); should be like: np.r_[0:2, 6:9]
    selection_indices = np.r_[[row[0]:row[1]] for row in selector]
    # return 2D slice
    return arr[:, selection_indices]

selector = np.array([[0, 2], [6, 9]])
sliced_arr = slice_returner(arr, selector)

如何将输入转换为选择片?最好是最少的数组创建/复制。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-22 10:07:01

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

代码语言:javascript
运行
复制
# 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]

内存开销只是掩码,它作为一个布尔数组应该是最小的,最后的输出也是必需的。

矢量化掩模创建

如果selector中有许多条目,那么有一种基于广播的矢量化方法来为cols创建掩码,如-

代码语言:javascript
运行
复制
r = np.arange(arr.shape[1])
mask = ((selector[:,0,None]<=r) & (selector[:,1,None]>r)).any(0)
票数 3
EN

Stack Overflow用户

发布于 2019-11-22 09:57:30

您只需从单个的数组创建索引数组即可。

代码语言:javascript
运行
复制
slices = [[0, 2], [6, 9]]
np.concatenate([np.arange(*i) for i in slices])
# array([0, 1, 6, 7, 8])

并使用它提取数据。

代码语言:javascript
运行
复制
arr[:, np.concatenate([np.arange(*i) for i in slices])]
# array([[ 0,  1,  6,  7,  8],
#        [12, 13, 18, 19, 20]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58991395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档