代码之家  ›  专栏  ›  技术社区  ›  Paul Jurczak

有NumPy魔法可以生成这个数组吗?

  •  3
  • Paul Jurczak  · 技术社区  · 11 月前

    我有一个数组 a 增加指数,例如。 [2 5 9 10] ,其指示值变化的位置。假设输出值为 0 1 ,我想得到数组 b :

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

    有NumPy魔法可以转换吗 进入之内 b ?

    3 回复  |  直到 11 月前
        1
  •  9
  •   chrslg    11 月前

    众多方式中的一种

    a=np.array([2,5,9,10])
    x=np.zeros((a.max()+1,), dtype=np.uint8)
    x[a]=1
    b=x.cumsum()%2
    

    一些解释(但我想代码,在这种罕见的情况下,是它自己的解释,因为一旦你看到它,它就很容易了) x(之后 x[a]=1 )在a中的每个给定位置都包含1。因此 x.cumsum() 包含一个为每个值递增的值:首先为2的值为0,然后为3的值为1,然后为2、3、4……因此 x.cumsum()%2 在1和0之间交替。

    请注意,我使用 np.uint8 因为我很便宜,所以我忍不住想“为什么我要花32位,而8位对于11位的数组来说就足够了”。但实际上,既然256是偶数,即使 a 拥有数十亿的价值。只是 x.cumsum() 由于溢出,将从255回滚到0。然后 x.累积()%2 将具有相同的值。

        2
  •  3
  •   ThomasIsCoding    11 月前

    也许你可以试试 np.diff + np.repeat 如下图所示

    d = np.diff([0] + a.tolist() + [max(a).tolist()+1])
    np.repeat((np.arange(d.size)) % 2, d)
    

    这给了

    array([0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0])
    
        3
  •  1
  •   rehaqds    11 月前

    如果S=[2 5 9 10]并返回最终结果,请注意,除了切片S[0]:S[1]、S[2]:S[3]、…之外,其他地方的值都是0。。。其中它是1:

    res = np.zeros(max(S)+1)
    idx = [slice(S[i], S[i+1]) for i in np.arange(len(S)-1) if not i%2]
    res[np.r_[*idx]] = 1
    
    [0. 0. 1. 1. 1. 0. 0. 0. 0. 1. 0.]