Python 在布尔索引过滤后重塑数据

Python 在布尔索引过滤后重塑数据,python,arrays,python-3.x,dataframe,numpy-ndarray,Python,Arrays,Python 3.x,Dataframe,Numpy Ndarray,我有一个名为data的数据集,它从N=173单个形状(4,4,64)的文件中重新组合了几个3D表格,因此在最后名为data的numpy数组具有形状(173,4,4,64)。在每个单独的文件中,我都有一个列,它是一个布尔列,用于指定数据是好是坏。为了过滤数据,我使用布尔条件: cond = DATA[:,3,:,:]==False DATA_filtered = DATA[:,1,:,:][cond] 具有以下形状: np.shape(DATA) Out[854]: (173, 4, 4,

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

cond = DATA[:,3,:,:]==False  
DATA_filtered = DATA[:,1,:,:][cond]
具有以下形状:

np.shape(DATA)
Out[854]: (173, 4, 4, 64)

np.shape(cond)
Out[855]: (173, 4, 64)
但由于我在最后使用了这种技术,所以我有一个1D数组,初始数据集的所有结构都丢失了。一种方法是使用用于
numpy.array
重塑
函数,但这种方法只有在最后维度保持不变时才有效。在布尔条件导致表格大小可变的情况下,我们不再能够预测并要求重新成形。那么,有没有一种方法可以过滤数据,但保持数据的全局形状,其大小可以根据数据中使用的标志而变化

下面是一个简单的例子:

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

cond = FLAG==False

data = TEST[:,0,:,:][cond]
输出:

np.shape(data)
Out[868]: (22167,)
预期产出:

np.shape(data)
Out[868]: (173,4,)
例如,对于
数据[:,1,:]
,一个数组大小在0到64之间的非等号子集会在174表中访问,具体取决于是否标记了数据筛选


提前感谢您

掩蔽阵列是您的解决方案

在许多情况下,数据集可能不完整或因存在无效数据而受到污染。例如,传感器可能无法记录数据,或记录了无效值。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, 0, 0, 1, 0])
mx.mean() # without taking the invalid data into account
输出

2.75
以上均取自
所以你也可以从那里读它,在一个nD张量上,你可以消除一个完整的n-1d切片,但不是随机的部分。例如,在2D中,可以删除整个列或行,但不能删除孤立的元素。在三维中,可以消除整个平面(xy、yz或zx),但不能消除孤立的一维柱。你想做的那种切片会产生参差不齐的阵列(“在你的4D张量中打洞”),因此是不可行的。然而,根据目前的答案,
numpy
具有“屏蔽数组”,正是针对这种情况。