【问题标题】:slice 2D numpy array based on condition根据条件切片 2D numpy 数组
【发布时间】:2015-01-25 01:34:15
【问题描述】:

我有一个 numpy 数组

import numpy as np

a = np.array([
[999, 999, 999, 999, 999, 999, 999, 999, 999, 999],
[999, 999, 999, 1, 2, 3, 4, 999, 999, 999],
[999, 999, 999, 5, 6, 7, 8, 999, 999, 999],
[999, 999, 999, 9, 10, 11, 12, 999, 999, 999],
[999, 999, 999, 999, 999, 999, 999, 999, 999, 999]])

如何使用 numpy 切片返回过滤后的值,仅包含与 999 不同的值?

filtered = np.where(a != 999)
In [5]: filtered
Out[5]: 
(array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4,
    4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
    6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9,
    9, 9, 9, 9, 9, 9, 9, 9]),
 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
    3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
    6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8,
    9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
    2, 3, 4, 5, 6, 7, 8, 9]))

期望的输出:

output = np.array([
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12]])

【问题讨论】:

    标签: arrays python-2.7 numpy slice


    【解决方案1】:

    您可以执行以下操作:

    >>> mask = (a!=999)
    >>> dim1 = np.any(mask, axis=1).sum()
    >>> a[mask].reshape(dim1, -1)
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    

    这当然假设您在整个数组中只有一个连续的框。

    【讨论】:

    • 特殊情况的一个很好的解决方案。可以为“其他”案例提出ValueError
    【解决方案2】:

    你的是一个特例,因为子数组是矩形的。您可以使用精美的索引获取平面值:

    >>> a[filtered]
    array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    

    如果你已经知道形状,你可以重新塑造它:

    >>> a[filtered].reshape(3,4)
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12]])
    

    但是,一般情况下,不能保证输入数据在过滤后会留下一个矩形数组。例如,考虑一下如果输入数组有a[0,0] == 13,输出数组应该是什么样子。

    【讨论】:

    • 对不起。在我的 cmets 之前,我没有阅读您的修改。主要问题是我真的不知道矩阵内有效数字的形状。这只是一个原始示例。就我而言,我不会得到@wim 指出的外部数字(即 a[0,0] == 13)
    • 您给出的示例没有很好地定义您的问题。
    • 在有效数字没有整齐地包含在矩形内的情况下给出所需的输出,例如,如果 a[0,1] != 999 其他所有内容都相同。
    • 如果一个元素 inside box 等于 999 呢?
    • 您是否喜欢我编辑我的问题并插入一个我不知道这些有效值索引的语句?如果您建议基于视觉的 .reshape(3,4)?
    【解决方案3】:

    您也可以这样做。使用条件创建 2D 蒙版。将条件掩码类型转换为 int 或 float,具体取决于数组,并将其与原始数组相乘。

    In [8]: arr
    Out[8]: 
    array([[ 1.,  2.,  3.,  4.,  5.],
           [ 6.,  7.,  8.,  9., 10.]])
    
    In [9]: arr*(arr % 2 == 0).astype(np.int) 
    Out[9]: 
    array([[ 0.,  2.,  0.,  4.,  0.],
           [ 6.,  0.,  8.,  0., 10.]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      相关资源
      最近更新 更多