【问题标题】:Finding fixed-length contiguous regions of an nan-filled array (no overlap)查找 nan 填充数组的固定长度连续区域(无重叠)
【发布时间】:2020-01-31 05:05:37
【问题描述】:

我在这里发现了类似的问题,但没有一个适用于行定义的时间序列数据。我预计可以通过 numpy 或 scipi 找到解决方案。因为我有这么多数据,所以我不想使用 pandas 数据框。

我有 许多 运行 19 通道 EEG 数据存储在 2d numpy 数组中。我已经检查了嘈杂的数据并将其标记为 nan,因此给定的运行可能看起来像:

C1  C2  C3  C4  C5  C6  C7  C8  C9  C10  C11  C12  C13  C14  C15  C16  C17  C18  C19
nan 7   5   4   nan nan 7   9   0   -3   nan  2    nan  nan  5    7    6    nan  8
0   6   7   3   5   9   2   2   4   6    8    7    5    6    4    -1   nan  -8   -9
6   8   7   7   0   3   2   4   5   1    3    7    3    8    4    6    9    0    0
...
nan nan nan 3   5   -1  0   nan nan nan  1    2    0    -1   -2   nan  nan  nan  nan

(没有频道标签)

每次运行的长度在 80,000 到 120,000 行(周期)之间。

对于这些运行中的每一个,我想创建一个新的连续非重叠 epoch 堆栈,其中没有任何值被人工制品到 nan。比如:

def generate_contigs(run, length):
   contigs = np.ndarray(three-dimensional array of arbitrary depth x 19 x length)
   count = 0
   for row in run:
      if nan not in row:
         count+=1
         if count==length:
            stack array of last (length) rows on contigs ndarray
            count = 0
      else:
         count = 0
   return(contigs)

例如,假设我指定长度为 4(任意小),并且我的函数找到了 9 个不重叠的 contig,其中 4 行的值为 nan。

我的输出应该类似于:

contigs = [
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array],
[19x4 array]
]

输出堆栈中的每个元素类似于以下内容:

[4 6 5 8 3 5 4 1 8 8 7 5 6 4 3 5 6 6 5]  
[5 5 7 2 2 9 8 7 7 8 3 0 7 4 4 6 3 7 3]  
[4 4 6 7 9 0 9 9 8 8 7 7 6 6 5 5 4 4 3]  
[1 2 3 4 5 4 3 6 5 4 3 7 6 5 8 7 6 9 8]

在原始运行的数据数组中连续找到该元素中包含的 4 行。

我觉得我离这里很近,但我在行操作和最小化迭代方面遇到了困难。如果您能找到一种方法将开始/停止行索引附加为元组以供以后分析,则可以加分。

【问题讨论】:

  • 你能澄清一下预期的输出应该是怎样的吗?也许添加与您显示的示例数据相对应的预期输出?
  • 拜托,edit 你的问题:cmets 不适用于代码。
  • 对不起,我正在努力格式化这里...
  • 慢慢来,别担心。请记住,cmets 不允许格式良好的多行代码。任何相关信息或代码段都应包含在问题本身中。
  • 我意识到您要我编辑我的问题,而不是添加评论。新手,感谢您的耐心等待。

标签: python numpy bioinformatics contiguous numpy-slicing


【解决方案1】:

您可以使用numpy indexing options 滚动数组,并使用numpy isnannumpy any 查看任何具有适当大小长度x 19 的选择是否包含任何nan 值。
如果没有nan 值,则将选择添加到contigs 列表并移到后面,如果有nan,则将索引移动1 并检查新选择是否没有nan
途中很容易存储堆叠选择的第一行的索引。

def generate_contigs(run, length):
    i = 0
    contigs = []
    startindexes = []
    while i < run.shape[0]-length:
        stk = run[i:(i+length),:]
        if not np.any(np.isnan(stk)):
            contigs.append(stk)
            startindexes.append(i)
            i += length
        else:
            i += 1
    return contigs, startindexes

【讨论】:

  • 这是完美的工作。它似乎也足够快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多