27 numpy使用矩陣進行NMS去重處理

2021-10-09 20:12:31 字數 3380 閱讀 8744

基本思想:對python而言,都繞不開numpy,逐決定以原始碼為導向,學習numpy的使用;首先引入乙個numpy的導向圖,記住其矩陣的1維、2維、3維形式;

修改了它人的原始碼,簡單分析一下

import numpy as np

x = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]])

print(x[1,0]) #參考上圖第二個圖,先取垂直軸的(第0行[0,1,2,3])第1行[4,5,6,7] 然後在取水平軸的第0列位置元素4

print(x[1:3,1:3]) #參考上圖第二個圖,先取垂直軸的第1-2行[[4,5,6,7],[8,9,10,11]] 然後在取水平軸的第1-2列位置元素[[5 6],[9 10]]

print(x[:2,:2])#參考上圖第二個圖,先取垂直軸的第0-1行[[0,1,2,3],[4,5,6,7]] 然後在取水平軸的第1-2列位置元素[[0 1],[4 5]]

print(x[:,:2])#參考上圖第二個圖,先取垂直軸的所有行[[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]然後在取水平軸的第0-1列位置元素[[0 1],[4 5],[8 9],[12 13]]

print(x[:,0])#參考上圖第二個圖,先取垂直軸的所有行[[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]然後在取水平軸的第0-1列位置元素[0 4 8 12 ]

#可以窺見一斑,[0維(垂直軸),1維(水平軸)]

4

[[ 5 6]

[ 9 10]]

[[0 1]

[4 5]]

[[ 0 1]

[ 4 5]

[ 8 9]

[12 13]]

[ 0 4 8 12]

同樣的維度空間運算還有

import numpy as np

x = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]])

y= np.eye(4,dtype=int,k=0)

z=np.concatenate((x,y),axis=0)

print(z)

z=np.concatenate((x,y),axis=1)

print(z)

[[ 0  1  2  3]

[ 4 5 6 7]

[ 8 9 10 11]

[12 13 14 15]

[ 1 0 0 0]

[ 0 1 0 0]

[ 0 0 1 0]

[ 0 0 0 1]]

[[ 0 1 2 3 1 0 0 0]

[ 4 5 6 7 0 1 0 0]

[ 8 9 10 11 0 0 1 0]

[12 13 14 15 0 0 0 1]]

process finished with exit code 0

np.maximum(x, y, out=none)

x和y逐位進行比較,選擇最大值.

最少接受兩個引數

記錄一下numpy的nms去重的基本演算法邏輯:

import numpy as np

def non_max_suppression(boxes, max_bbox_overlap, scores=none):

if len(boxes) == 0:

return

boxes = boxes.astype(np.float)

pick =

x1 = boxes[:, 0]

y1 = boxes[:, 1]

x2 = boxes[:, 2]

y2 = boxes[:, 3]

area = (x2 - x1 + 1) * (y2 - y1 + 1) #計算各個檢測框的面積

if scores is not none:

idxs = np.argsort(scores) #將面積大小的分數進行排序,輸出索引

else:

idxs = np.argsort(y2)

while len(idxs) > 0:

last = len(idxs) - 1

i = idxs[last]

xx1 = np.maximum(x1[i], x1[idxs[:last]]) #繪圖比較直觀觀察

yy1 = np.maximum(y1[i], y1[idxs[:last]])

xx2 = np.minimum(x2[i], x2[idxs[:last]])

yy2 = np.minimum(y2[i], y2[idxs[:last]])

w = np.maximum(0, xx2 - xx1 + 1)

h = np.maximum(0, yy2 - yy1 + 1)

overlap = (w * h) / area[idxs[:last]]

idxs = np.delete(idxs, np.concatenate(([last], np.where(overlap > max_bbox_overlap)[0])))

return pick

boxes =np.asarray([[ 97,545, 179,784], [99,401, 178,640], [ 546,146,625,385 ]]) #xmin ymin xmax,ymax

scores = np.asarray([3.16,3.1112,2.686])

indices = non_max_suppression(boxes, 0.3, scores)

boxes = [list(boxes[i]) for i in indices]

scores = [scores[i] for i in indices]

print(boxes,scores)

print(np.maximum(0,[1,2,3]))

print( np.where(np.array([23])>4)[0])

print(np.concatenate(([2],np.where(np.array([23])>4)[0])))

print(np.delete([3,4,2,5],np.concatenate(([2],np.where(np.array([23])>4)[0]))))

使用numpy對矩陣進行運算

如下 encoding utf 8 importnumpyasnp fromnumpy.linalgimportinv fromnumpyimportdot fromnumpyimportmat a np.mat 1,1 建立乙個一行一列的矩陣 print a矩陣為 n a print a矩陣的轉置...

使用Numpy進行one hot編碼

在實現很多機器學習任務的時候,經常需要將labels進行one hot encoding,具體思想這裡就不詳述,借一張圖來表示 numpy實現可以是這樣 函式需不需要返回轉置要根據具體情況看 如果不轉置每個label返回的就是乙個行向量 這裡轉置了,每個label就是對應的列向量 def conve...

Python 謹慎使用python進行矩陣計算

矩陣乘法 左乘 設a為m p的矩陣,b為p n的矩陣,那麼稱m n的矩陣c為矩陣a與b的乘積,記作c ab,稱為a左乘以b。左乘是做行變換 用對角陣左乘乙個矩陣,就是用對角陣的對角元分別乘這個矩陣的對應各行 右乘 設a為m p的矩陣,b為p n的矩陣,那麼度稱m n的矩陣c為矩陣a與b的乘積,記作版...