機器學(xué)習(xí)服務(wù)提取圖片的特征向量">使用SAP Leonardo上的機器學(xué)習(xí)服務(wù)提取圖片的特征向量
613
2025-04-01
在內(nèi)置數(shù)據(jù)類型(dict、list、set、tuple)的基礎(chǔ)上,collections模塊還提供了幾個額外的數(shù)據(jù)類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
1.namedtuple: 生成可以使用名字來訪問元素內(nèi)容的tuple
2.deque: 雙端隊列,可以快速的從另外一側(cè)追加和推出對象
3.Counter: 計數(shù)器,主要用來計數(shù)
4.OrderedDict: 有序字典
5.defaultdict: 帶有默認(rèn)值的字典
1、namedtuple
我們知道tuple可以表示不變集合,例如,一個點的二維坐標(biāo)就可以表示成:
>>>?p=(2,6)
但是,看到(1, 2),很難看出這個tuple是用來表示一個坐標(biāo)的。
這時,namedtuple就派上了用場:
from?collections?import?namedtuple point?=?namedtuple("point",?['x',?'y']) print(point) p_obj?=?point(6,?8) print(p_obj.x) print(p_obj.y)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py
類似的,如果要用坐標(biāo)和半徑表示一個圓,也可以用namedtuple定義:
#?namedtuple('名稱',?[屬性list]): Circle?=?namedtuple("Circle",?['x',?'y',?'r']) cir?=?Circle(8,?6,?10) print(cir.x) print(cir.y) print(cir.r)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py 8 6 10 Process?finished?with?exit?code?0
2、deque
使用list存儲數(shù)據(jù)時,按索引訪問元素很快,但是插入和刪除元素就很慢了,因為list是線性存儲,數(shù)據(jù)量大的時候,插入和刪除效率很低。
deque是為了高效實現(xiàn)插入和刪除操作的雙向列表,適合用于隊列和棧:
from?collections?import?deque q?=?deque(['a',?'b',?'c']) q.append('d') print(q) q.appendleft('e') print(q) q.pop() print(q) q.popleft() print(q)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py deque(['a',?'b',?'c',?'d']) deque(['e',?'a',?'b',?'c',?'d']) deque(['e',?'a',?'b',?'c']) deque(['a',?'b',?'c']) Process?finished?with?exit?code?0
deque除了實現(xiàn)list的append()和pop()外,還支持appendleft()和popleft(),這樣就可以非常高效地往頭部添加或刪除元素。
3、OrderedDict
使用dict時,Key是無序的。在對dict做迭代時,我們無法確定Key的順序。
如果要保持Key的順序,可以用OrderedDict:
from?collections?import?OrderedDict lis?=?[('a',?21),?('b',?55),?('c',?86)] dic?=?dict(lis)??#?dict的Key是無序的 print(dic) ord_dic?=?OrderedDict(lis)??#?OrderedDict的Key是有序的 print(ord_dic)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py {'a':?21,?'b':?55,?'c':?86} OrderedDict([('a',?21),?('b',?55),?('c',?86)]) Process?finished?with?exit?code?0
注意,OrderedDict的Key會按照插入的順序排列,不是Key本身排序:
ord_dic?=?OrderedDict() ord_dic['z']?=?99 ord_dic['y']?=?110 ord_dic['z']?=?666 print(ord_dic.keys())??#?按照插入的Key的順序返回
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py odict_keys(['z',?'y']) Process?finished?with?exit?code?0
4、defaultdict
有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大于?66?的值保存至字典的第一個key中,將小于?66?的值保存至第二個key的值中。
即: {'k1': 大于66?,?'k2': 小于66}
lis?=?[11,?22,?33,?55,?77,?66,?88,?99] dic?=?{} for?value?in?lis: ????if?value?>?66: ????????if?dic.has_key('k1'): ????????????dic['k1'].append(value) ????????else: ????????????dic['k1']?=?[value] ????else: ????????if?dic.has_key('k2'): ????????????dic['k2'].append(value) ????????else: ????????????dic['k2']?=?[value]
from?collections?import?defaultdict lis?=?[11,?22,?33,?55,?77,?66,?88,?99] my_dic?=?defaultdict(lis) for?value?in?lis: ????if?value?>?66: ????????my_dic['k1'].append(value) ????else: ????????my_dic['k2'].append(value) print(my_dic)
使用dict時,如果引用的Key不存在,就會拋出KeyError。如果希望key不存在時,返回一個默認(rèn)值,就可以用defaultdict:
from?collections?import?defaultdict dd?=?defaultdict(lambda:?'N/A') dd['key1']?=?'abc'??#?key1存在 print(dd['key1']) print(dd['key2'])??#?key2不存在,返回默認(rèn)值 print(dd['key3'])
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py abc N/A N/A Process?finished?with?exit?code?0
5、Counter
Counter類的目的是用來跟蹤值出現(xiàn)的次數(shù)。它是一個無序的容器類型,以字典的鍵值對形式存儲,其中元素作為key,其計數(shù)作為value。計數(shù)值可以是任意的Interger(包括0和負(fù)數(shù))。Counter類和其他語言的bags或multisets很相似。
from?collections?import?Counter coun?=?Counter("absdsdsdadsdsa") print(coun)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo005.py Counter({'s':?5,?'d':?5,?'a':?3,?'b':?1}) Process?finished?with?exit?code?0
創(chuàng)建
下面的代碼說明了Counter類創(chuàng)建的四種方法:
from?collections?import?Counter c?=?Counter()??#?創(chuàng)建一個空的Counter類 print(c) c?=?Counter('g***d')??#?從一個可iterable對象(list、tuple、dict、字符串等)創(chuàng)建 print(c) c?=?Counter({'a':?4,?'b':?2})??#?從一個字典對象創(chuàng)建 print(c) c?=?Counter(a=4,?b=2)??#?從一組鍵值對創(chuàng)建 print(c)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter() Counter({'a':?3,?'l':?2,?'g':?1,?'h':?1,?'d':?1}) Counter({'a':?4,?'b':?2}) Counter({'a':?4,?'b':?2}) Process?finished?with?exit?code?0
計數(shù)值的訪問與缺失的鍵
當(dāng)所訪問的鍵不存在時,返回0,而不是KeyError;否則返回它的計數(shù)。
計數(shù)值的訪問
from?collections?import?Counter cou?=?Counter("hello?world") print(cou["l"]) print(cou["o"]) print(cou["a"])
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py 3 2 0 Process?finished?with?exit?code?0
計數(shù)器的更新(update和subtract)
可以使用一個iterable對象或者另一個Counter對象來更新鍵值。
計數(shù)器的更新包括增加和減少兩種。其中,增加使用update()方法:
計數(shù)器的更新(update)
from?collections?import?Counter cou?=?Counter("hello?world") cou.update("which")??#?使用另一個iterable對象更新 print(cou["h"]) c?=?Counter("watch") cou.update(c)??#?使用另一個Counter對象更新 print(cou["h"])
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py 3 4 Process?finished?with?exit?code?0
減少則使用subtract()方法:
計數(shù)器的更新(subtract)
from?collections?import?Counter c?=?Counter('which') print(c["h"]) c.subtract('witch')??#?使用另一個iterable對象更新 print(c['h']) d?=?Counter('watch') c.subtract(d)??#?使用另一個Counter對象更新 print(c['a'])
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py 2 1 -1 Process?finished?with?exit?code?0
鍵的修改和刪除
當(dāng)計數(shù)值為0時,并不意味著元素被刪除,刪除元素應(yīng)當(dāng)使用del。
鍵的刪除
from?collections?import?Counter c?=?Counter("abcdcba") print(c) c["b"]?=?0 print(c) del?c["a"] print(c)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?2,?'b':?2,?'c':?2,?'d':?1}) Counter({'a':?2,?'c':?2,?'d':?1,?'b':?0}) Counter({'c':?2,?'d':?1,?'b':?0}) Process?finished?with?exit?code?0
elements()
返回一個迭代器。元素被重復(fù)了多少次,在該迭代器中就包含多少個該元素。元素排列無確定順序,個數(shù)小于1的元素不被包含。
elements()方法
from?collections?import?Counter c?=?Counter(a=4,?b=2,?c=0,?d=-2) print(list(c.elements()))
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py ['a',?'a',?'a',?'a',?'b',?'b'] Process?finished?with?exit?code?0
most_common([n])
返回一個TopN列表。如果n沒有被指定,則返回所有元素。當(dāng)多個元素計數(shù)值相同時,排列是無確定順序的。
most_common()方法
from?collections?import?Counter c?=?Counter('abracadabra') print(c) print(c.most_common()) print(c.most_common(3))
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?5,?'b':?2,?'r':?2,?'c':?1,?'d':?1}) [('a',?5),?('b',?2),?('r',?2),?('c',?1),?('d',?1)] [('a',?5),?('b',?2),?('r',?2)] Process?finished?with?exit?code?0
淺拷貝copy
淺拷貝copy
from?collections?import?Counter c?=?Counter("abcdcba") print(c) d?=?c.copy() print(d)
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?2,?'b':?2,?'c':?2,?'d':?1}) Counter({'a':?2,?'b':?2,?'c':?2,?'d':?1}) Process?finished?with?exit?code?0
算術(shù)和集合操作
+、-、&、|操作也可以用于Counter。其中&和|操作分別返回兩個Counter對象各元素的最小值和最大值。需要注意的是,得到的Counter對象將刪除小于1的元素。
Counter對象的算術(shù)和集合操作
from?collections?import?Counter c?=?Counter(a=3,?b=1) d?=?Counter(a=1,?b=2) print(c?+?d)??#?c[x]?+?d[x] print(c?-?d)??#?subtract(只保留正數(shù)計數(shù)的元素) print(c?&?d)??#?交集:??min(c[x],?d[x]) print(c?|?d)??#?并集:??max(c[x],?d[x])
結(jié)果:
D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe?D:/YuchuanProjectData/PythonProject/YuchuanDemo006.py Counter({'a':?4,?'b':?3}) Counter({'a':?2}) Counter({'a':?1,?'b':?1}) Counter({'a':?3,?'b':?2}) Process?finished?with?exit?code?0
其他常用操作
下面是一些Counter類的常用操作,來源于Python官方文檔
Counter類常用操作
sum(c.values())??#?所有計數(shù)的總數(shù) c.clear()??#?重置Counter對象,注意不是刪除 list(c)??#?將c中的鍵轉(zhuǎn)為列表 set(c)??#?將c中的鍵轉(zhuǎn)為 setdict(c)??#?將c中的鍵值對轉(zhuǎn)為字典 c.items()??#?轉(zhuǎn)為(elem,?cnt)格式的列表 Counter(dict(list_of_pairs))??#?從(elem,?cnt)格式的列表轉(zhuǎn)換為Counter類對象 c.most_common()[:-n:-1]??#?取出計數(shù)最少的n個元素 c?+=?Counter()??#?移除0和負(fù)值
軟件開發(fā) 人工智能 機器學(xué)習(xí) AI
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。