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]

總的來說還是比較簡單的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM