task5 排序搜尋計數及集合操作
學習目標:
task5 排序搜尋計數及集合操作
學習產出:
排序,搜尋和計數
排序
numpy.sort()
numpy.sort(a[, axis=-1, kind='quicksort', order=None])
Return a sorted copy of an array.- axis:排序沿陣列的(軸)方向,0表示按行,1表示按列,None表示展開來排序,預設為-1,表示沿最後的軸排序。
- kind:排序的演算法,提供了快排’quicksort’、混排’mergesort’、堆排’heapsort’, 預設為‘quicksort’。
- order:排序的欄位名,可指定欄位排序,預設為None。
【例】
import numpy as np
np.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
# [6.93 5.17 9.28 9.76 8.25]
# [0.01 4.23 0.19 1.73 9.27]
# [7.99 4.97 0.88 7.32 4.29]
# [9.05 0.07 8.95 7.9 6.99]]
y = np.sort(x)
print(y)
# [[1.73 2.32 6.22 7.54 9.78]
# [5.17 6.93 8.25 9.28 9.76]
# [0.01 0.19 1.73 4.23 9.27]
# [0.88 4.29 4.97 7.32 7.99]
# [0.07 6.99 7.9 8.95 9.05]]
y = np.sort(x, axis=0)
print(y)
# [[0.01 0.07 0.19 1.73 4.29]
# [2.32 4.23 0.88 1.73 6.22]
# [6.93 4.97 8.95 7.32 6.99]
# [7.99 5.17 9.28 7.9 8.25]
# [9.05 7.54 9.78 9.76 9.27]]
y = np.sort(x, axis=1)
print(y)
# [[1.73 2.32 6.22 7.54 9.78]
# [5.17 6.93 8.25 9.28 9.76]
# [0.01 0.19 1.73 4.23 9.27]
# [0.88 4.29 4.97 7.32 7.99]
# [0.07 6.99 7.9 8.95 9.05]]
【例】
import numpy as np
dt = np.dtype([('name', 'S10'), ('age', np.int)])
a = np.array([("Mike", 21), ("Nancy", 25), ("Bob", 17), ("Jane", 27)], dtype=dt)
b = np.sort(a, order='name')
print(b)
# [(b'Bob', 17) (b'Jane', 27) (b'Mike', 21) (b'Nancy', 25)]
b = np.sort(a, order='age')
print(b)
# [(b'Bob', 17) (b'Mike', 21) (b'Nancy', 25) (b'Jane', 27)]
如果排序後,想用元素的索引位置替代排序後的實際結果,該怎麼辦呢?
numpy.argsort()
numpy.argsort(a[, axis=-1, kind='quicksort', order=None])
Returns the indices that would sort an array.
【例】對陣列沿給定軸執行間接排序,並使用指定排序型別返回資料的索引陣列。這個索引陣列用於構造排序後的陣列。
import numpy as np
np.random.seed(20200612)
x = np.random.randint(0, 10, 10)
print(x)
# [6 1 8 5 5 4 1 2 9 1]
y = np.argsort(x)
print(y)
# [1 6 9 7 5 3 4 0 2 8]
print(x[y])
# [1 1 1 2 4 5 5 6 8 9]
y = np.argsort(-x)
print(y)
# [8 2 0 3 4 5 7 1 6 9]
print(x[y])
# [9 8 6 5 5 4 2 1 1 1]
【例】
import numpy as np
np.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
# [6.93 5.17 9.28 9.76 8.25]
# [0.01 4.23 0.19 1.73 9.27]
# [7.99 4.97 0.88 7.32 4.29]
# [9.05 0.07 8.95 7.9 6.99]]
y = np.argsort(x)
print(y)
# [[3 0 4 1 2]
# [1 0 4 2 3]
# [0 2 3 1 4]
# [2 4 1 3 0]
# [1 4 3 2 0]]
y = np.argsort(x, axis=0)
print(y)
# [[2 4 2 0 3]
# [0 2 3 2 0]
# [1 3 4 3 4]
# [3 1 1 4 1]
# [4 0 0 1 2]]
y = np.argsort(x, axis=1)
print(y)
# [[3 0 4 1 2]
# [1 0 4 2 3]
# [0 2 3 1 4]
# [2 4 1 3 0]
# [1 4 3 2 0]]
y = np.array([np.take(x[i], np.argsort(x[i])) for i in range(5)])
#numpy.take(a, indices, axis=None, out=None, mode='raise')沿軸從陣列中獲取元素。
print(y)
# [[1.73 2.32 6.22 7.54 9.78]
# [5.17 6.93 8.25 9.28 9.76]
# [0.01 0.19 1.73 4.23 9.27]
# [0.88 4.29 4.97 7.32 7.99]
# [0.07 6.99 7.9 8.95 9.05]]
如何將資料按照某一指標進行排序呢?
numpy.lexsort()
-
numpy.lexsort(keys[, axis=-1])
Perform an indirect stable sort using a sequence of keys.(使用鍵序列執行間接穩定排序。) -
給定多個可以在電子表格中解釋為列的排序鍵,lexsort返回一個整數索引陣列,該陣列描述了按多個列排序的順序。序列中的最後一個鍵用於主排序順序,倒數第二個鍵用於輔助排序順序,依此類推。keys引數必須是可以轉換為相同形狀的陣列的物件序列。如果為keys引數提供了2D陣列,則將其行解釋為排序鍵,並根據最後一行,倒數第二行等進行排序。
【例】按照第一列的升序或者降序對整體資料進行排序。
import numpy as np
np.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
# [6.93 5.17 9.28 9.76 8.25]
# [0.01 4.23 0.19 1.73 9.27]
# [7.99 4.97 0.88 7.32 4.29]
# [9.05 0.07 8.95 7.9 6.99]]
index = np.lexsort([x[:, 0]])
print(index)
# [2 0 1 3 4]
y = x[index]
print(y)
# [[0.01 4.23 0.19 1.73 9.27]
# [2.32 7.54 9.78 1.73 6.22]
# [6.93 5.17 9.28 9.76 8.25]
# [7.99 4.97 0.88 7.32 4.29]
# [9.05 0.07 8.95 7.9 6.99]]
index = np.lexsort([-1 * x[:, 0]])
print(index)
# [4 3 1 0 2]
y = x[index]
print(y)
# [[9.05 0.07 8.95 7.9 6.99]
# [7.99 4.97 0.88 7.32 4.29]
# [6.93 5.17 9.28 9.76 8.25]
# [2.32 7.54 9.78 1.73 6.22]
# [0.01 4.23 0.19 1.73 9.27]]
【例】
import numpy as np
x = np.array([1, 5, 1, 4, 3, 4, 4])
y = np.array([9, 4, 0, 4, 0, 2, 1])
a = np.lexsort([x])
b = np.lexsort([y])
print(a)
# [0 2 4 3 5 6 1]
print(x[a])
# [1 1 3 4 4 4 5]
print(b)
# [2 4 6 5 1 3 0]
print(y[b])
# [0 0 1 2 4 4 9]
z = np.lexsort([y, x])
print(z)
# [2 0 4 6 5 3 1]
print(x[z])
# [1 1 3 4 4 4 5]
z = np.lexsort([x, y])
print(z)
# [2 4 6 5 3 1 0]
print(y[z])
# [0 0 1 2 4 4 9]
numpy.partition()
numpy.partition(a, kth, axis=-1, kind='introselect', order=None)
Return a partitioned copy of an array.
Creates a copy of the array with its elements rearranged in such a way that the value of the element in k-th position is in the position it would be in a sorted array. All elements smaller than the k-th element are moved before this element and all equal or greater are moved behind it. The ordering of the elements in the two partitions is undefined.
【例】以索引是 kth 的元素為基準,將元素分成兩部分,即大於該元素的放在其後面,小於該元素的放在其前面,這裡有點類似於快排。
import numpy as np
np.random.seed(100)
x = np.random.randint(1, 30, [8, 3])
print(x)
# [[ 9 25 4]
# [ 8 24 16]
# [17 11 21]
# [ 3 22 3]
# [ 3 15 3]
# [18 17 25]
# [16 5 12]
# [29 27 17]]
y = np.sort(x, axis=0)
print(y)
# [[ 3 5 3]
# [ 3 11 3]
# [ 8 15 4]
# [ 9 17 12]
# [16 22 16]
# [17 24 17]
# [18 25 21]
# [29 27 25]]
z = np.partition(x, kth=2, axis=0)
print(z)
# [[ 3 5 3]
# [ 3 11 3]
# [ 8 15 4]
# [ 9 22 21]
# [17 24 16]
# [18 17 25]
# [16 25 12]
# [29 27 17]]
【例】選取每一列第三小的數
import numpy as np
np.random.seed(100)
x = np.random.randint(1, 30, [8, 3])
print(x)
# [[ 9 25 4]
# [ 8 24 16]
# [17 11 21]
# [ 3 22 3]
# [ 3 15 3]
# [18 17 25]
# [16 5 12]
# [29 27 17]]
z = np.partition(x, kth=2, axis=0)
print(z[2])
# [ 8 15 4]
【例】選取每一列第三大的資料
import numpy as np
np.random.seed(100)
x = np.random.randint(1, 30, [8, 3])
print(x)
# [[ 9 25 4]
# [ 8 24 16]
# [17 11 21]
# [ 3 22 3]
# [ 3 15 3]
# [18 17 25]
# [16 5 12]
# [29 27 17]]
z = np.partition(x, kth=-3, axis=0)
print(z[-3])
# [17 24 17]
numpy.argpartition()
numpy.argpartition(a, kth, axis=-1, kind='introselect', order=None)
Perform an indirect partition along the given axis using the algorithm specified by the kind
keyword. It returns an array of indices of the same shape as a
that index data along the given axis in partitioned order.
【例】
import numpy as np
np.random.seed(100)
x = np.random.randint(1, 30, [8, 3])
print(x)
# [[ 9 25 4]
# [ 8 24 16]
# [17 11 21]
# [ 3 22 3]
# [ 3 15 3]
# [18 17 25]
# [16 5 12]
# [29 27 17]]
y = np.argsort(x, axis=0)
print(y)
# [[3 6 3]
# [4 2 4]
# [1 4 0]
# [0 5 6]
# [6 3 1]
# [2 1 7]
# [5 0 2]
# [7 7 5]]
z = np.argpartition(x, kth=2, axis=0)
print(z)
# [[3 6 3]
# [4 2 4]
# [1 4 0]
# [0 3 2]
# [2 1 1]
# [5 5 5]
# [6 0 6]
# [7 7 7]]
【例】選取每一列第三小的數的索引
import numpy as np
np.random.seed(100)
x = np.random.randint(1, 30, [8, 3])
print(x)
# [[ 9 25 4]
# [ 8 24 16]
# [17 11 21]
# [ 3 22 3]
# [ 3 15 3]
# [18 17 25]
# [16 5 12]
# [29 27 17]]
z = np.argpartition(x, kth=2, axis=0)
print(z[2])
# [1 4 0]
【例】選取每一列第三大的數的索引
import numpy as np
np.random.seed(100)
x = np.random.randint(1, 30, [8, 3])
print(x)
# [[ 9 25 4]
# [ 8 24 16]
# [17 11 21]
# [ 3 22 3]
# [ 3 15 3]
# [18 17 25]
# [16 5 12]
# [29 27 17]]
z = np.argpartition(x, kth=-3, axis=0)
print(z[-3])
# [2 1 7]
搜尋
numpy.argmax()
numpy.argmax(a[, axis=None, out=None])
Returns the indices of the maximum values along an axis.
【例】
import numpy as np
np.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
# [6.93 5.17 9.28 9.76 8.25]
# [0.01 4.23 0.19 1.73 9.27]
# [7.99 4.97 0.88 7.32 4.29]
# [9.05 0.07 8.95 7.9 6.99]]
y = np.argmax(x)
print(y) # 2
y = np.argmax(x, axis=0)
print(y)
# [4 0 0 1 2]
y = np.argmax(x, axis=1)
print(y)
# [2 3 4 0 0]
numpy.argmin()
numpy.argmin(a[, axis=None, out=None])
Returns the indices of the minimum values along an axis.
【例】
import numpy as np
np.random.seed(20200612)
x = np.random.rand(5, 5) * 10
x = np.around(x, 2)
print(x)
# [[2.32 7.54 9.78 1.73 6.22]
# [6.93 5.17 9.28 9.76 8.25]
# [0.01 4.23 0.19 1.73 9.27]
# [7.99 4.97 0.88 7.32 4.29]
# [9.05 0.07 8.95 7.9 6.99]]
y = np.argmin(x)
print(y) # 10
y = np.argmin(x, axis=0)
print(y)
# [2 4 2 0 3]
y = np.argmin(x, axis=1)
print(y)
# [3 1 0 2 1]
numppy.nonzero()
numppy.nonzero(a)
Return the indices of the elements that are non-zero.
,其值為非零元素的下標在對應軸上的值。
- 只有
a
中非零元素才會有索引值,那些零值元素沒有索引值。 - 返回一個長度為
a.ndim
的元組(tuple),元組的每個元素都是一個整數陣列(array)。 - 每一個array均是從一個維度上來描述其索引值。比如,如果
a
是一個二維陣列,則tuple包含兩個array,第一個array從行維度來描述索引值;第二個array從列維度來描述索引值。 - 該
np.transpose(np.nonzero(x))
函式能夠描述出每一個非零元素在不同維度的索引值。 - 通過
a[nonzero(a)]
得到所有a
中的非零值。
【例】一維陣列
import numpy as np
x = np.array([0, 2, 3])
print(x) # [0 2 3]
print(x.shape) # (3,)
print(x.ndim) # 1
y = np.nonzero(x)
print(y) # (array([1, 2], dtype=int64),)
print(np.array(y)) # [[1 2]]
print(np.array(y).shape) # (1, 2)
print(np.array(y).ndim) # 2
print(np.transpose(y))
# [[1]
# [2]]
print(x[np.nonzero(x)])
#[2, 3]
【例】二維陣列
import numpy as np
x = np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]])
print(x)
# [[3 0 0]
# [0 4 0]
# [5 6 0]]
print(x.shape) # (3, 3)
print(x.ndim) # 2
y = np.nonzero(x)
print(y)
# (array([0, 1, 2, 2], dtype=int64), array([0, 1, 0, 1], dtype=int64))
print(np.array(y))
# [[0 1 2 2]
# [0 1 0 1]]
print(np.array(y).shape) # (2, 4)
print(np.array(y).ndim) # 2
y = x[np.nonzero(x)]
print(y) # [3 4 5 6]
y = np.transpose(np.nonzero(x))
print(y)
# [[0 0]
# [1 1]
# [2 0]
# [2 1]]
【例】三維陣列
import numpy as np
x = np.array([[[0, 1], [1, 0]], [[0, 1], [1, 0]], [[0, 0], [1, 0]]])
print(x)
# [[[0 1]
# [1 0]]
#
# [[0 1]
# [1 0]]
#
# [[0 0]
# [1 0]]]
print(np.shape(x)) # (3, 2, 2)
print(x.ndim) # 3
y = np.nonzero(x)
print(np.array(y))
# [[0 0 1 1 2]
# [0 1 0 1 1]
# [1 0 1 0 0]]
print(np.array(y).shape) # (3, 5)
print(np.array(y).ndim) # 2
print(y)
# (array([0, 0, 1, 1, 2], dtype=int64), array([0, 1, 0, 1, 1], dtype=int64), array([1, 0, 1, 0, 0], dtype=int64))
print(x[np.nonzero(x)])
#[1 1 1 1 1]
【例】nonzero()
將布林陣列轉換成整數陣列進行操作。
import numpy as np
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
y = x > 3
print(y)
# [[False False False]
# [ True True True]
# [ True True True]]
y = np.nonzero(x > 3)
print(y)
# (array([1, 1, 1, 2, 2, 2], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
y = x[np.nonzero(x > 3)]
print(y)
# [4 5 6 7 8 9]
y = x[x > 3]
print(y)
# [4 5 6 7 8 9]
numpy.where()
numpy.where(condition, [x=None, y=None])
Return elements chosen fromx
ory
depending oncondition
.
【例】滿足條件condition
,輸出x
,不滿足輸出y
。
import numpy as np
x = np.arange(10)
print(x)
# [0 1 2 3 4 5 6 7 8 9]
y = np.where(x < 5, x, 10 * x)
print(y)
# [ 0 1 2 3 4 50 60 70 80 90]
x = np.array([[0, 1, 2],
[0, 2, 4],
[0, 3, 6]])
y = np.where(x < 4, x, -1)
print(y)
# [[ 0 1 2]
# [ 0 2 -1]
# [ 0 3 -1]]
【例】只有condition
,沒有x
和y
,則輸出滿足條件 (即非0) 元素的座標 (等價於numpy.nonzero
)。這裡的座標以tuple的形式給出,通常原陣列有多少維,輸出的tuple中就包含幾個陣列,分別對應符合條件元素的各維座標。
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.where(x > 5)
print(y)
# (array([5, 6, 7], dtype=int64),)
print(x[y])
# [6 7 8]
y = np.nonzero(x > 5)
print(y)
# (array([5, 6, 7], dtype=int64),)
print(x[y])
# [6 7 8]
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
y = np.where(x > 25)
print(y)
# (array([3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int64), array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))
print(x[y])
# [26 27 28 29 30 31 32 33 34 35]
y = np.nonzero(x > 25)
print(y)
# (array([3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int64), array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int64))
print(x[y])
# [26 27 28 29 30 31 32 33 34 35]
numpy.searchsorted()
numpy.searchsorted(a, v[, side='left', sorter=None])
Find indices where elements should be inserted to maintain order.- a:一維輸入陣列。當
sorter
引數為None
的時候,a
必須為升序陣列;否則,sorter
不能為空,存放a
中元素的index
,用於反映a
陣列的升序排列方式。 - v:插入
a
陣列的值,可以為單個元素,list
或者ndarray
。 - side:查詢方向,當為
left
時,將返回第一個符合條件的元素下標;當為right
時,將返回最後一個符合條件的元素下標。 - sorter:一維陣列存放
a
陣列元素的 index,index 對應元素為升序。
- a:一維輸入陣列。當
【例】
import numpy as np
x = np.array([0, 1, 5, 9, 11, 18, 26, 33])
y = np.searchsorted(x, 15)
print(y) # 5
y = np.searchsorted(x, 15, side='right')
print(y) # 5
y = np.searchsorted(x, -1)
print(y) # 0
y = np.searchsorted(x, -1, side='right')
print(y) # 0
y = np.searchsorted(x, 35)
print(y) # 8
y = np.searchsorted(x, 35, side='right')
print(y) # 8
y = np.searchsorted(x, 11)
print(y) # 4
y = np.searchsorted(x, 11, side='right')
print(y) # 5
y = np.searchsorted(x, 0)
print(y) # 0
y = np.searchsorted(x, 0, side='right')
print(y) # 1
y = np.searchsorted(x, 33)
print(y) # 7
y = np.searchsorted(x, 33, side='right')
print(y) # 8
【例】
import numpy as np
x = np.array([0, 1, 5, 9, 11, 18, 26, 33])
y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35])
print(y) # [0 0 4 5 7 8]
y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], side='right')
print(y) # [0 1 5 5 8 8]
【例】
import numpy as np
x = np.array([0, 1, 5, 9, 11, 18, 26, 33])
np.random.shuffle(x)
print(x) # [33 1 9 18 11 26 0 5]
x_sort = np.argsort(x)
print(x_sort) # [6 1 7 2 4 3 5 0]
y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], sorter=x_sort)
print(y) # [0 0 4 5 7 8]
y = np.searchsorted(x, [-1, 0, 11, 15, 33, 35], side='right', sorter=x_sort)
print(y) # [0 1 5 5 8 8]
計數
numpy.count_nonzero()
numpy.count_nonzero(a, axis=None)
Counts the number of non-zero values in the array a.
【例】返回陣列中的非0元素個數。
import numpy as np
x = np.count_nonzero(np.eye(4))
print(x) # 4
x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]])
print(x) # 5
x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis=0)
print(x) # [1 1 1 1 1]
x = np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis=1)
print(x) # [2 3]
集合操作
構造集合
numpy.unique(ar, return_index=False, return_inverse=False, return_counts=False, axis=None)
Find the unique elements of an array.return_index=True
表示返回新列表元素在舊列表中的位置。return_inverse=True
表示返回舊列表元素在新列表中的位置。return_counts=True
表示返回新列表元素在舊列表中出現的次數。
【例】找出陣列中的唯一值並返回已排序的結果。
import numpy as np
x = np.unique([1, 1, 3, 2, 3, 3])
print(x) # [1 2 3]
x = sorted(set([1, 1, 3, 2, 3, 3]))
print(x) # [1, 2, 3]
x = np.array([[1, 1], [2, 3]])
u = np.unique(x)
print(u) # [1 2 3]
x = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
y = np.unique(x, axis=0)
print(y)
# [[1 0 0]
# [2 3 4]]
x = np.array(['a', 'b', 'b', 'c', 'a'])
u, index = np.unique(x, return_index=True)
print(u) # ['a' 'b' 'c']
print(index) # [0 1 3]
print(x[index]) # ['a' 'b' 'c']
x = np.array([1, 2, 6, 4, 2, 3, 2])
u, index = np.unique(x, return_inverse=True)
print(u) # [1 2 3 4 6]
print(index) # [0 1 4 3 1 2 1]
print(u[index]) # [1 2 6 4 2 3 2]
u, count = np.unique(x, return_counts=True)
print(u) # [1 2 3 4 6]
print(count) # [1 3 1 1 1]
布林運算
numpy.in1d(ar1, ar2, assume_unique=False, invert=False)
Test whether each element of a 1-D array is also present in a second array.
Returns a boolean array the same length as ar1
that is True where an element of ar1
is in ar2
and False otherwise.
【例】前面的陣列是否包含於後面的陣列,返回布林值。返回的值是針對第一個引數的陣列的,所以維數和第一個引數一致,布林值與陣列的元素位置也一一對應。
import numpy as np
test = np.array([0, 1, 2, 5, 0])
states = [0, 2]
mask = np.in1d(test, states)
print(mask) # [ True False True False True]
print(test[mask]) # [0 2 0]
mask = np.in1d(test, states, invert=True)
print(mask) # [False True False True False]
print(test[mask]) # [1 5]
求兩個集合的交集:
numpy.intersect1d(ar1, ar2, assume_unique=False, return_indices=False)
Find the intersection of two arrays.
Return the sorted, unique values that are in both of the input arrays.
【例】求兩個陣列的唯一化+求交集+排序函式。
import numpy as np
from functools import reduce
x = np.intersect1d([1, 3, 4, 3], [3, 1, 2, 1])
print(x) # [1 3]
x = np.array([1, 1, 2, 3, 4])
y = np.array([2, 1, 4, 6])
xy, x_ind, y_ind = np.intersect1d(x, y, return_indices=True)
print(x_ind) # [0 2 4]
print(y_ind) # [1 0 2]
print(xy) # [1 2 4]
print(x[x_ind]) # [1 2 4]
print(y[y_ind]) # [1 2 4]
x = reduce(np.intersect1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
print(x) # [3]
求兩個集合的並集:
numpy.union1d(ar1, ar2)
Find the union of two arrays.
Return the unique, sorted array of values that are in either of the two input arrays.
【例】計算兩個集合的並集,唯一化並排序。
import numpy as np
from functools import reduce
x = np.union1d([-1, 0, 1], [-2, 0, 2])
print(x) # [-2 -1 0 1 2]
x = reduce(np.union1d, ([1, 3, 4, 3], [3, 1, 2, 1], [6, 3, 4, 2]))
print(x) # [1 2 3 4 6]
'''
functools.reduce(function, iterable[, initializer])
將兩個引數的 function 從左至右積累地應用到 iterable 的條目,以便將該可迭代物件縮減為單一的值。 例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) 是計算 ((((1+2)+3)+4)+5) 的值。 左邊的引數 x 是積累值而右邊的引數 y 則是來自 iterable 的更新值。 如果存在可選項 initializer,它會被放在參與計算的可迭代物件的條目之前,並在可迭代物件為空時作為預設值。 如果沒有給出 initializer 並且 iterable 僅包含一個條目,則將返回第一項。
大致相當於:
def reduce(function, iterable, initializer=None):
it = iter(iterable)
if initializer is None:
value = next(it)
else:
value = initializer
for element in it:
value = function(value, element)
return value
'''
求兩個集合的差集:
numpy.setdiff1d(ar1, ar2, assume_unique=False)
Find the set difference of two arrays.
Return the unique values in ar1
that are not in ar2
.
【例】集合的差,即元素存在於第一個函式不存在於第二個函式中。
import numpy as np
a = np.array([1, 2, 3, 2, 4, 1])
b = np.array([3, 4, 5, 6])
x = np.setdiff1d(a, b)
print(x) # [1 2]
求兩個集合的異或:
setxor1d(ar1, ar2, assume_unique=False)
Find the set exclusive-or of two arrays.
【例】集合的對稱差,即兩個集合的交集的補集。簡言之,就是兩個陣列中各自獨自擁有的元素的集合。
import numpy as np
a = np.array([1, 2, 3, 2, 4, 1])
b = np.array([3, 4, 5, 6])
x = np.setxor1d(a, b)
print(x) # [1 2 5 6]
相關文章
- python之Numpy 排序搜尋計數及集合操作Python排序
- Numpy 排序搜尋計數與集合操作排序
- 搜尋排序技術簡介排序
- 搜尋引擎ElasticSearch18_ElasticSearch程式設計操作5Elasticsearch程式設計
- LeetCode 33——搜尋旋轉排序陣列LeetCode排序陣列
- 拼多多搜尋詞統計 API介面操作展示說明API
- LeetCode 81——搜尋旋轉排序陣列 IILeetCode排序陣列
- 【LeetCode】初級演算法:排序和搜尋LeetCode演算法排序
- LeetCode33. 搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode#33搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode33 搜尋旋轉排序陣列LeetCode排序陣列
- 【LeetCode(Java) - 33】搜尋旋轉排序陣列LeetCodeJava排序陣列
- leetCode33搜尋旋轉排序陣列LeetCode排序陣列
- 搜尋EE場景排序鏈路升級排序
- 【技術點】計算機基礎演算法——排序 & 搜尋 & 字串匹配計算機演算法排序字串匹配
- 二叉搜尋樹的操作集
- 力扣·33. 搜尋旋轉排序陣列力扣排序陣列
- Django(67)drf搜尋過濾和排序過濾Django排序
- leetcode, LC68:旋轉排序陣列搜尋LeetCode排序陣列
- 一文搞定二叉排序(搜尋)樹排序
- 堆的基本操作及堆排序排序
- 計數排序vs基數排序vs桶排序排序
- 資料結構與演算法 排序與搜尋資料結構演算法排序
- 基於PostgreSQL實時干預搜尋排序實踐SQL排序
- 力扣-81. 搜尋旋轉排序陣列 II力扣排序陣列
- 計數排序排序
- 搜尋引擎優化內容及方法優化
- 最佳路徑搜尋(二):啟發式搜尋(代價一致搜尋(Dijkstra search),貪心搜尋,A*搜尋)
- CSU 1563 Lexicography (搜尋+組合數)
- Java排序之計數排序Java排序
- SAP CRM產品主資料搜尋功能的With individual object搜尋引數Object
- 海量資料搜尋---搜尋引擎
- python之排序操作及heapq模組Python排序
- PbootCMS呼叫搜尋頁和標籤頁的關鍵詞及數量boot
- MapReduce 實現 搜尋指數統計和找到人氣王
- 二分搜尋樹系列之[ 插入操作 (insert) ]
- 二分搜尋樹系列之「 插入操作 (insert) 」
- EasyFind for Mac操作簡單的檔案搜尋工具Mac