如何解决以不同的方式切片每一行
我有一个numpy.array
形状的a
(8,16000,2)
,代表8个立体声音频,每1s长。我想从每个记录中采样一个0.5s的子采样。因此,我通过以下方式采样开始和结束索引:
a = np.random.rand(8,2)
possible_starts = np.arange(8000)
start_idxs = np.random.choice(possible_starts,size=a.shape[0])
end_idxs = start_idxs + 8000
如何以numpy的效率为每一行提取这些不同的切片? 我显然可以循环执行:
b = np.zeros((8,8000,2))
for i in range(a.shape[0]):
b[i] = a[i,start_idxs[i]: end_idxs[i],:]
但是我想以向量化的方式来做。
解决方法
我们可以利用基于np.lib.stride_tricks.as_strided
的scikit-image's view_as_windows
来获取滑动窗口视图,从而以向量化的方式解决我们的问题。
from skimage.util.shape import view_as_windows
w = view_as_windows(a,(1,8000,1))[:,:,0]
b_out = w[np.arange(len(start_idxs)),start_idxs].swapaxes(1,2)
或者按照@Daniel F的建议使用np.take_along_axis(w,start_idxs,axis=1).swapaxes(1,2)
来提高可读性。
More info on use of as_strided
based view_as_windows
。
鉴于您的循环仅循环8
次,您应该进行基准测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。