【问题标题】:Slicing arrays based on boolean array in python基于python中的布尔数组切片数组
【发布时间】:2016-10-24 17:55:12
【问题描述】:

我需要根据布尔数组(其中布尔数组是一维数组)中的条件对 xyz 坐标数组进行切片。

如果我的布尔数组是

[1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1]

我需要它对其进行切片以生成以下索引数组:

[0, 1, 2, 3, 6, 7, 10, 11, 12](真索引之间的[:-2])

最终所需的输出将是这些索引处的 xyz 坐标数组:

[xyz[0], xyz[1], xyz[2] xyz[3], xyz[6] xyz[7], xyz[10] xyz[11], xyz[12]]

另外两个切片(具有相似的期望输出)如下:

[1, 2, 3, 4, 7, 8, 11, 12, 13](真索引之间的[1:-1])

[2, 3, 4, 5, 8, 9, 12, 13, 14](真索引之间的[2:])

有没有一种没有列表理解的pythonic方法?

谢谢!

【问题讨论】:

  • 这个“切片”的结果应该是什么,例如[0, 1, 2, 3, 6, 7, 10, 11, 12] ([:-2] between True indices) 的预期输出是什么?
  • 索引是输出(我认为)。最终目标是隔离这些索引处感兴趣的 xyz 坐标。为了清楚起见,我将编辑问题
  • 为什么没有列表理解?这可能是最pythonic的方式
  • 我正在尝试对大部分代码进行矢量化处理,因此我尝试尽可能避免列表推导并尽可能依赖映射。一些列表推导是不可避免的,我只是想知道在这种情况下是否有更好的方法。

标签: python arrays numpy boolean-logic object-slicing


【解决方案1】:

看起来numpy.ndarray.nonzero 是你需要的:

a = np.asarray([1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1])
print(a.nonzero())

输出:

array([ 0,  5,  6,  9, 10, 14])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2015-09-13
    • 2021-02-01
    • 1970-01-01
    • 2020-08-12
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多