【问题标题】:Convert 2d-array to 2d-array of unique values per row将二维数组转换为每行唯一值的二维数组
【发布时间】:2020-05-09 17:06:58
【问题描述】:

我有一个形状为 5x4 的二维数组,如下所示:

array([[3, 3, 3, 3],
   [3, 3, 3, 3],
   [3, 3, 2, 2],
   [2, 2, 2, 2],
   [2, 2, 2, 2]])

我想获得另一个包含唯一值数组的数组,如下所示:

array([array([3]), array([3]), array([2, 3]), array([2]), array([2])],
      dtype=object)

我通过以下代码获得了:

np.array([np.unique(row) for row in matrix])

但是,这不是矢量化的。如何在矢量化 numpy 操作中实现同样的效果?

【问题讨论】:

  • 鉴于输出的参差不齐的性质,您不能使用矢量化的。你可以有一个性能更高的人
  • 另外,这些只是正数吗?

标签: python arrays numpy numpy-ndarray


【解决方案1】:

numpy 数组必须具有已定义的形状,因此如果您的数据对于某些行只有 1 值,而对于其他行只有 2 或更多值,那么这是行不通的。一种解决方法是用已知值填充数组,例如。 np.nan.

在这种情况下,np.unique 将为您解决所有问题。如果你使用它的axis 参数。在这种情况下,您需要每行唯一的值,因此我们使用 axis=1

arr = np.array([[3, 3, 3, 3],
                [3, 3, 3, 3],
                [3, 3, 2, 2],
                [2, 2, 2, 2],
                [2, 2, 2, 2]])

np.unique(arr, axis=1)
>>> array([[3, 3],
           [3, 3],
           [2, 3],
           [2, 2],
           [2, 2]])

结果是一个数组,每行都有正确的唯一值,尽管有些是重复的,但这是拥有一个数组的代价。

【讨论】:

    【解决方案2】:

    这是在迭代时最小化计算的一种方法,应该有助于提高性能 -

    b = np.sort(a,axis=1)
    o = np.ones((len(a),1), dtype=bool)
    mask = np.c_[o,b[:,:-1] != b[:,1:]]
    c = b[mask]
    out = np.split(c, mask.sum(1).cumsum())[:-1]
    

    使用slicing 的循环可能比np.split 更好。因此,在每次迭代中,我们所做的只是切片。因此,最后一步可以用这样的东西代替 -

    idx = np.r_[0,mask.sum(1).cumsum()]
    out = []
    for (i,j) in zip(idx[:-1],idx[1:]):
        out.append(c[i:j])
    

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2018-02-19
      • 2020-03-26
      • 2019-01-23
      • 2021-11-23
      • 2021-07-20
      相关资源
      最近更新 更多