zoukankan      html  css  js  c++  java
  • numpy中的数组之间进行集合运算

    楔子

    我们知道python的set对象是可以取交集、并集、差集、对称差集的,但是对于numpy有没有这个方法呢?有时候我们在使用pandas(底层基于numpy)处理数据的时候,不希望再单独转化为集合再进行处理,而numpy也是支持我们这么做的,下面来看一下。

    集合运算

    set中的集合运算

    set中的集合运算,比较简单,我们还是简单看一下吧

    set1 = {1, 2, 3}
    set2 = {2, 3, 4}
    
    """
    &: 交集
    |: 并集 
    -: 差集
    ^: 对称差集
    """
    
    # 以下几种方式是等价的,但是一般我们都会使用操作符来进行处理,因为比较方便
    print(set1 & set2)  # {2, 3}
    print(set1.intersection(set2))  # {2, 3}
    print(set.intersection(set1, set2))  # {2, 3}
    
    print(set1 | set2)  # {1, 2, 3, 4}
    print(set1.union(set2))  # {1, 2, 3, 4}
    print(set.union(set1, set2))  # {1, 2, 3, 4}
    
    print(set1 - set2, set2 - set1)  # {1} {4}
    print(set1.difference(set2), set2.difference(set1))  # {1} {4}
    print(set.difference(set1, set2), set.difference(set2, set1))  # {1} {4}
    
    print(set1 ^ set2)  # {1, 4}
    print(set1.symmetric_difference(set2))  # {1, 4}
    print(set.symmetric_difference(set1, set2))  # {1, 4}
    
    
    """
    另外,以上所有的操作都支持多个集合,不仅仅只是两个
    """
    print({1, 2, 3} & {2, 3, 4} & {3, 4, 5})  # {3}
    

    numpy中的集合运算

    numpy中的数组虽然也支持&等操作符,但是它们代表的意义和集合无关。

    import numpy as np
    
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([2, 3, 4])
    
    # 两个数组进行&,表示将数组里面对应元素分别进行"按位与"操作
    print(arr1 & arr2)  # [0 2 0]
    

    所以,我们需要使用numpy提供的api进行运算

    import numpy as np
    
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([2, 3, 4])
    
    # 取交集
    print(
        np.intersect1d(arr1, arr2)
    )  # [2 3]
    
    # 取并集
    print(
        np.union1d(arr1, arr2)
    )  # [1 2 3 4]
    
    # 取差集
    print(
        np.setdiff1d(arr1, arr2),
        np.setdiff1d(arr2, arr1)
    )  # [1] [4]
    
    # 取对称差集
    print(
        np.setxor1d(arr1, arr2)
    )  # [1 4]
    

    接收两个array,返回一个array。但是我们看到它和集合一个区别就是,集合要求里面的元素是不能重复的,但是数组却没有此要求。

    import numpy as np
    
    arr1 = np.array([1, 2, 2, 2, 3])
    arr2 = np.array([2, 3, 4])
    
    print(np.intersect1d(arr1, arr2))  # [2 3]
    print(np.union1d(arr1, arr2))  # [1 2 3 4]
    

    但是我们上面只能传入两个数组,如果有多个数组呢?

    from functools import reduce
    import numpy as np
    
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([2, 3, 4])
    arr3 = np.array([3, 4, 5])
    
    print(reduce(np.intersect1d, [arr1, arr2, arr3]))  # [3]
    

    总的来说还是比较简单的

  • 相关阅读:
    期权标的概率密度函数
    Girsanov Theorem
    拉马努金恒等式
    波动率的三类模型
    stack(栈) and heap(堆)
    covar of lognormal variables
    BS 相关的一些近似公式
    布朗运动的一些特殊性质
    排序算法
    Mac node.js
  • 原文地址:https://www.cnblogs.com/traditional/p/12625998.html
Copyright © 2011-2022 走看看