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:查找另一個數組中出現的一個數組中元素的索引

(完)


免責聲明!

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



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