【问题标题】:How can I simply filter a 3d numpy array by its 1st column values?如何通过 3d numpy 数组的第一列值简单地过滤它?
【发布时间】:2020-05-08 22:26:45
【问题描述】:

假设我有一个像这样的 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

data[data[0]<3]

但这失败了:

IndexError: 布尔索引与第 0 维的索引数组不匹配;维度为 3,但对应的布尔维度为 2

【问题讨论】:

  • 这里需要更具体一点,一行包含多个数字,所以你应该指定你想要小于3的任何数字,小于3的所有数字,还是其他诸如总和之类的东西小于 3 的数字。

标签: python arrays numpy


【解决方案1】:

请参阅我上面的评论,但根据您的数据,我猜您想要任何值小于 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]&lt;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. ]]])

【讨论】:

  • 我不够清楚。通过选择轴 0 dataNew = np.array([[[1,2],[1,2.5]], [[116,230],[80,100]], [[60,100],[50,80]]])
  • 好的,我已经修改了我的答案,希望对您有所帮助
  • 索引数组(括号内)是否需要转置?
  • 我做了另一个不涉及转置的编辑。使用遮罩的技巧是遮罩形状必须与您应用它的数组或轴相同,在这种情况下,它是最后一个轴。
猜你喜欢
  • 2018-10-04
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2014-09-07
  • 2017-07-03
  • 2021-09-25
  • 2012-03-06
  • 2022-09-24
相关资源
最近更新 更多