繁体   English   中英

如何通过第一列值简单地过滤 3d numpy 数组?

[英]How can I simply filter a 3d numpy array by its 1st column values?

假设我有一个像这样的 3D numpy 数组:

 data = np.array([[[1,2,3,4],[1,2.5,3,5]],
                 [[116,230,450,430],[80,100,300,320]],
                 [[60,100,120,80],[50,80,100,90]]])

我怎样才能简单地从中提取一个 3D numpy 数组,其形状相同,轴 0 上有条件,例如选择轴 0 < 3 的那些“行”? 一种天真的方式是

data[data[0]<3]

但这失败了:

IndexError:boolean 索引与维度 0 上的索引数组不匹配; 尺寸为 3,但对应的 boolean 尺寸为 2

请参阅上面的评论,但根据您的数据,我猜您想要任何值小于 3 的行。如果是这样,您可以这样做:

data[(data<3).any(axis=2)]
>>> array([[1. , 2. , 3. , 4. ],
           [1. , 2.5, 3. , 5. ]])

编辑1:

可以使用转置来匹配轴尺寸来实现解决方案:

data.T[(data[0]<3).any(axis=0).T].T
>>> array([[[  1. ,   2. ],
            [  1. ,   2.5]],

           [[116. , 230. ],
            [ 80. , 100. ]],

           [[ 60. , 100. ],
            [ 50. ,  80. ]]])

编辑2:

另一种不涉及转置的方法。 要将掩码(data[0]<3).any(axis=0)原始数据数组,轴的形状必须匹配。 蒙版的形状是(4,)data.shape = (3, 2, 4) ,所以我们需要将蒙版应用于最后一个轴:

data[..., (data[0]<3).any(axis=0)]
>>> array([[[  1. ,   2. ],
            [  1. ,   2.5]],

           [[116. , 230. ],
            [ 80. , 100. ]],

           [[ 60. , 100. ],
            [ 50. ,  80. ]]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM