查找 nan 填充数组的固定长度连续区域(无重叠)
Finding fixed-length contiguous regions of an nan-filled array (no overlap)
我在此处发现了类似的问题,但 none 适用于行定义的时间序列数据。我预计可以通过 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 行(周期)之间。
对于这些 运行 中的每一个,我想创建一个新堆栈的连续非重叠时期,其中没有任何值被伪造到 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 个不重叠的重叠群,其中连续 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 行。
我觉得我很接近这里,但我正在努力处理行操作和最小化迭代。如果您能找到一种方法将 start/stop 行索引作为元组附加以供以后分析,则可加分。
你可以使用 numpy indexing options to roll over the array and see if any selection with the proper size length x 19 contains any nan
value using numpy isnan and numpy any.
如果没有 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
我在此处发现了类似的问题,但 none 适用于行定义的时间序列数据。我预计可以通过 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 行(周期)之间。
对于这些 运行 中的每一个,我想创建一个新堆栈的连续非重叠时期,其中没有任何值被伪造到 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 个不重叠的重叠群,其中连续 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 行。
我觉得我很接近这里,但我正在努力处理行操作和最小化迭代。如果您能找到一种方法将 start/stop 行索引作为元组附加以供以后分析,则可加分。
你可以使用 numpy indexing options to roll over the array and see if any selection with the proper size length x 19 contains any nan
value using numpy isnan and numpy any.
如果没有 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