布尔索引过滤后重塑数据

问题描述

我有一个名为 DATA 的数据集,它从单个形状 N=173(4,4,64) 文件中重新组合了几个 3D 表,因此最后名为 DATA 的 numpy 数组具有形状 { {1}}。在每个单独的文件中,我有一列是一个布尔列,用于指定数据是好是坏。为了过滤我的数据,我使用布尔条件:

(173,64)

具有以下形状:

cond = DATA[:,3,:,:]==False  
DATA_filtered = DATA[:,1,:][cond]

但是因为我在最后使用了这种技术,所以我有一个一维数组,并且初始数据集的所有结构都丢失了。一种技术是使用用于 np.shape(DATA) Out[854]: (173,64) np.shape(cond) Out[855]: (173,64) reshape 函数,但该技术仅在此时维度保持不变时才有效。在布尔条件导致可变大小表的情况下,我们不再可以预测和要求重塑。那么有没有一种方法可以过滤数据,同时保持数据的全局形状,其大小可能因数据中使用的标志而异?

这是一个最小的例子:

numpy.array

输出

TEST = np.ones((173,64))
FLAG = np.random.choice(a=[False,True],size=(173,64))

cond = FLAG==False

data = TEST[:,:][cond]

预期输出

np.shape(data)
Out[868]: (22167,)

例如np.shape(data) Out[868]: (173,) ,根据已标记或未标记的数据过滤,在 174 表中具有 0 到 64 之间不等数组大小的子集。

提前致谢

解决方法

Masked Array 是您的解决方案

在许多情况下,数据集可能不完整或因存在无效数据而受到污染。例如,传感器可能未能记录数据,或记录了无效值。 numpy.ma 模块通过引入掩码数组提供了一种方便的方法来解决这个问题。

掩码数组是标准 numpy.ndarray 和掩码的组合

import numpy as np
import numpy.ma as ma

x = np.array([1,2,3,-1,5])
mx = ma.masked_array(x,mask=[0,1,0])
mx.mean() # without taking the invalid data into account

输出

2.75

以上所有内容均取自Masked array 所以你不妨从那里阅读它