• numpy 数组集合运算及下标操作


    1. 数组的集合运算

    1.1. 并集

    np.union1d(a,b)计算数组的并集:

    In [1]: import numpy as np
    In [2]: a = np.array([1,2,3])
    In [3]: b = np.array([3,4,5])
    In [4]: np.union1d(a,b)
    Out[4]: array([1, 2, 3, 4, 5])

    1.2. 交集

    np.intersect1d(a,b)计算数组的交集:

    In [10]: import numpy as np
    In [11]: a = np.array([2,3,4,5])
    In [12]: b = np.array([3,5,6])
    In [13]: np.intersect1d(a,b)
    Out[13]: array([3, 5])

    1.3. 差集

    np.setdiff1d(a,b)计算结果为a集合减去b集合,也就是剩下没有在b中出现的元素:

    In [15]: import numpy as np
    In [16]: a = [1,1,2,2,3,4,5]
    In [17]: b = [2,5] 
    In [18]: np.setdiff1d(a,b)
    Out[18]: array([1, 3, 4])

    1.4. 异或

    np.setxor1d(a,b)计算a、b集合的异或结果。

    In [15]: import numpy as np
    In [16]: a = [1,1,2,2,3,4,5]
    In [17]: b = [2,5] 
    In [26]: np.setxor1d(a,b)
    Out[26]: array([1, 3, 4])

    可以注意到,一般对两个数组进行集合操作,会对数组自动进行去重。

    2. np.where函数

    2.1. 第一种用法

    where(c, a, b),是numpy风格的if-else三元运算符。它通过一个布尔数组(c)和两个其他数组(a和b)得出数组d,数组d满足:如果c[i]为真,则d[i]=a[i],否则d[i]=b[i]。三个数组必须具有相同的形状。

    例1:

    In [30]: x = np.random.randn(4,4)
    In [31]: x
    Out[31]:
    array([[ 0.47223924, -0.74427759, -1.67279362,  0.01203576],
           [-0.83590182,  1.70742332, -1.01150273,  0.50330454],
           [ 0.76771725, -1.38832902, -0.62673363,  0.27442247],
           [-1.01199694, -0.65573435,  0.89553293, -0.74830605]])
    In [32]: np.where(x>0,2,-2)
    Out[32]:
    array([[ 2, -2, -2,  2],
           [-2,  2, -2,  2],
           [ 2, -2, -2,  2],
           [-2, -2,  2, -2]])

    例2:

    In [33]: xarr = np.array([1.1,1.2,1.3,1.4,1.5])
        ...: yarr = np.array([2.1,2.2,2.3,2.4,2.5])
        ...: zarr = np.array([True,False,True,True,False])
    In [34]: np.where(zarr,xarr,yarr)
    Out[34]: array([1.1, 2.2, 1.3, 1.4, 2.5])

    2.2. 第二种用法

    where(conditions) ,相当于给出符合条件的数组元素的下标。

    例子1:

    In [37]: x = np.random.randn(4)
    In [38]: x
    Out[38]: array([-0.0860867 ,  1.42173872, -1.44341208,  0.61600628])
    In [39]: np.where(x>0)
    Out[39]: (array([1, 3], dtype=int64),)

    例子2:如果想要求a集合中的元素在b中也存在,这样的下标,需要用到np.in1d(a,b)或者np.isin(a,b):

    In [40]: a = np.array([1,2,4,5,6])
    In [41]: b = np.array([2,6])
    In [42]: np.where(np.in1d(a, b))
    Out[42]: (array([1, 4], dtype=int64),)

    In [46]: np.where(np.isin(a,b))
    Out[46]: (array([1, 4], dtype=int64),)

    可以观察到,where(conditions)取下标,返回的是一个元组,如果需要取这个下标数组需要通过结果result[0]去取或者(result,)=np.where(conditions)

    3. 参考

    (1) Numpy中的集合运算

    (2) python – Numpy:查找另一个数组中出现的一个数组中元素的索引

    (完)

  • 相关阅读:
    杂文: 日剧《轮到你了》第7集中的组合数学问题
    CF 板刷总结
    【题解】P2324 [SCOI2005]骑士精神
    【模板】 $ ext{K}$ 短路
    P4554 小明的游戏
    [题解]P1856 [USACO5.5]矩形周长Picture
    洛谷P2243 电路维修
    【题解】洛谷P3660 [USACO17FEB]Why Did the Cow Cross the Road III
    【题解】P1119 灾后重建
    集福卡活动
  • 原文地址:https://www.cnblogs.com/harrymore/p/11984193.html
Copyright © 2020-2023  润新知