【发布时间】:2018-01-24 19:19:48
【问题描述】:
我正在寻找一种内存/cpu 高效的单线器来从列表中的每个 m 元素中对 n 进行子采样。到目前为止,我得到了:
sb = [11,12,21,22,31,32]*4 #stream buffer, e.g. 4 identical frames
ci = 1 #1-indexed channel index
cs = 2 #channel (sample) size
nc = 3 #number of channels in each frame
fs = nc*cs #frame size
[i for l in [sb[j+ci-1:j+ci-1+cs] for j
in [x*fs+ci-1 for x in xrange(len(sb)/fs)]] for i in l]
Out: [11, 12, 11, 12, 11, 12, 11, 12]
分解它我正在创建一个示例列表列表,然后使用[i for l in ll for i in l]将其展平为一维列表
或者,不是单行,但更容易阅读,我可以这样做:
os = []
for i in [sb[j+ci-1:j+ci-1+cs] for j in [x*fs+ci-1 for x in xrange(len(sb)/fs)]]: os = os+i
与cs=1 特定情况的超级简单简写相比,这两种解决方案看起来都过于复杂:sb[ci-1::fs]。
你能帮我想出一个体面的解决方案吗?
【问题讨论】:
-
您需要随机抽样吗?
random.sample([11,12,21,22,31,32]*4,8)将从列表中抽取 8 个随机样本,而不会重复任何采样索引 - 您的解决方案看起来更像是每 n.th sublis 采样的线性 -
@Patrick Artner:不。我需要从流中提取一个通道(通道解复用)。流在元素列表上被展平。每个通道每个样本都采用 cs 连续元素。流上的每一帧都包含 nc 个连续样本,每个通道一个。我想从流中的特定通道中提取每个样本到一个新列表中,当然要保持顺序。
-
您是否尝试从流缓冲区中获取第一个 n 个相同帧,在这种情况下是 4 个相同帧中的每个帧中的 2 个元素?跨度>
-
@Idlehands:或多或少。是的,在这种情况下,来自所选通道的 4 个相同帧中的每一个中有 2 个元素。 (很抱歉第一条评论是我误解了你写的内容)。
标签: python arrays python-2.7 list-comprehension multiplexing