pythonmapnone
Ⅰ python高階函數有哪些
1、map
map()函數接受兩個參數,一個是函數,灶枝一個是Iterable,map將傳入的函數依次作用到序列的每一個元素上,並把結果作為新的Iterator返回。
舉例,比如我們有一個函數f(x)=x*2,要把這個函數作用在一個list[1, 2, 3, 4, 5, 6, 7, 8,
9]上,就可以用map()實現。
>>> def f(x):
... return x*2
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[2, 4, 6, 8, 10, 12, 14, 16, 18]
所以,map()作為高階函數,事實上它把運算規則抽象了,因此,我們不但可以計算簡單的f(x)=x*2,還可以計算任意復雜的函數,比如把這個list所有的數字轉為字元串:
>>> list(map(str,[1, 2, 3, 4, 5, 6, 7, 8, 9]))
["1", "2", "3", "4", "5", "6", "7", "8", "9"]
2、rece
rece是把一個函數作用在一個序列[x1, x2,
x3……]上,這個函數必須接收兩個參數,rece把結果繼續和序列的下一個元素做累計計算。簡單來說,就是先計算x1和x2的結果,再拿結果與x3計算,依次類推。比如說一個序列求和,就可以氏毀用rece實現。
>>> from functools import rece
>>> def add(x, y):
... return x + y
...
>>> rece(add, [1, 3, 5, 7, 9])
25
也就是說,假設python沒有提供int()函數,你完全可以自己寫一個把字元串轉化為整數的函數,而且只需要幾行代碼。
3、filter
用於過濾序列,和map函數類似,filter也接收一個函數和一個序列,不同於map的是,filter把傳入的函數依次作用於每一個元素,然後根據返回值是True還是False決定保留還是丟棄該元素,例如,在一個list中,刪隱核敏掉偶數,只保留奇數,可以這么寫:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 結果: [1, 5, 9, 15]
把一個序列中的空字元串刪掉,可以這么寫:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ["A", "", "B", None, "C", " "]))
# 結果: ["A", "B", "C"]
可見用filter()這個高階函數,關鍵在於正確實現一個篩選函數。
4、sorted
無論冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字元串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函數抽象出來,Python內置的sorted()函數就可以對list進行排序:
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
此外,sorted()函數也是一個高階函數,它還可以接收一個key函數來實現自定義的排序,例如按絕對值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
Ⅱ python map函數怎麼用啊!
1、對可迭代函數'iterable'中的每一個元素應用『function』方法,將結果作為list返回。
來個例子:
>>> def add100(x):
... return x+100
...
>>> hh = [11,22,33]
>>> map(add100,hh)
[111, 122, 133]
就像文檔中說的:對hh中的元素做了add100,返回了結果的list。
2、如果給出了額外的可迭代參數,則對每個可迭代參數中的元素『並行』的應用『function』。(翻譯的不好,這里的關鍵是『並行』)
>>> def abc(a, b, c):
... return a*10000 + b*100 + c
...
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
>>> map(abc,list1,list2,list3)
[114477, 225588, 336699]
看到並行的效果了吧!在每個list中,取出了下標相同的元素,執行了abc()。
3、如果'function'給出的是『None』,自動假定一個『identity』函數(這個『identity』不知道怎麼解釋,看例子吧)
>>> list1 = [11,22,33]
>>> map(None,list1)
[11, 22, 33]
>>> list1 = [11,22,33]
>>> list2 = [44,55,66]
>>> list3 = [77,88,99]
>>> map(None,list1,list2,list3)
[(11, 44, 77), (22, 55, 88), (33, 66, 99)]
Ⅲ 怎麼用Python寫maprece,請舉例說明,初學者,請賜教,不勝感激
1.lambda
#匿名函數
#基本用法lambdax:x**2
#第一個參數,然後是表達式
#也可以使用如下
(lambdax:x**2)(5)
2.map()
defmap(function,sequence,*sequence_1):#realsignatureunknown;restoredfrom__doc__
"""
map(function,sequence[,sequence,...])->list
theargumentsequence(s).Ifmorethanonesequenceisgiven,the
itemofeachsequence,
sequenceshavethesamelength.IfthefunctionisNone,returnalistof
theitemsofthesequence().
"""
return[]
#兩個參數,一個處理函數,一個可迭代的序列
#返回一個列表
#例如計算1到10的平方,並以列表的形式返回
map(lambdax:x**2,range(1,11))
#結果如下
[1,4,9,16,25,36,49,64,81,100]
#當然也可以如下這樣使用
defsquare(x):
returnx**2
map(square,range(1,11))
3.rece()
defrece(function,sequence,initial=None):#realsignatureunknown;restoredfrom__doc__
"""
rece(function,sequence[,initial])->value
,
fromlefttoright,.
Forexample,rece(lambdax,y:x+y,[1,2,3,4,5])calculates
((((1+2)+3)+4)+5).Ifinitialispresent,itisplacedbeforetheitems
ofthesequenceinthecalculation,andservesasadefaultwhenthe
sequenceisempty.
"""
pass
#兩個參數,一個接受兩個參數的函數,一個序列參數
#例如計算1到10的和
rece(lambdax,y:x+y,range(1,11))
#當然,不適用lambda匿名函數也可以
defadd(x,y):
returnx+y
rece(add,range(1,11))
#結果如下
45
4.filter()
deffilter(function_or_none,sequence):#knownspecialcaseoffilter
"""
filter(functionorNone,sequence)->list,tuple,orstring
(item)istrue.If
functionisNone,returntheitemsthataretrue.Ifsequenceisatuple
orstring,returnthesametype,elsereturnalist.
"""
pass
#接受兩個參數,一個過濾函數,返回True或者False,以及一個序列
#例如,計算100以內的偶數
filter(lambdax:x%2==0,range(100))
#如上
defdiv2(x):
ifx%2==0:
returnTrue
else:
returnFalse
filter(div2,range(100))
#結果如下
[0,2,4,6,8,10,12,14,16,...]
Ⅳ 為什麼python3中運行list(map(None,l1,l2)) 報錯TypeError: 'NoneType' object is not callable
估計是solution的塵指問題,鉛團改動一下派激配代碼就可以了:class Solution(object): def removeElements(self, head, val): """ :type head: ListNode :type val: int :rtype: ListNode """ cur = ListNode(0) cur.next = head p = cur cur.next=None while p.next: if p.next.val == val: cur.next=p.next p.next = p.next.next break p = p.next return cur.next
Ⅳ python中的b32decode(s, casefold=False, map01=None) 函數
不型叢舉會查文檔嗎? 幫你查了下
http://docs.python.org/2/library/base64.html#base64.b32decode
內容也很簡單啊,casefold 指定是否輸出小寫字母,map01是為了防止輸出卜碧中會混淆數字0和字母o,數字1和鄭仔字母I和l,=None是說輸出中不包含數字0和數字1
Ⅵ python 編程 一維變成二維 怎麼把a=[1,3,5,6,7,8] 變換成 b = [[1,3],[5,6],[7,8]]
>>>槐激 a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>畝顫 map(None,a[::2],a[1::2])
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
>>鉛耐襪>
Ⅶ python d=map怎麼理解
Python中map()、filter()、rece()這三個都是應用於序列的內置函數。
格式:
map(func, seq1[, seq2,…])
第一個參數接受一個函數名,後面的參數接受一個或多個可迭代的序列,返回的是一個集合。
Python函數編程中的map()函數是將func作用於seq中的每一個元素,並將所有的調用的結果作為一個list返回。如果func為None,作用同zip()。
1、當seq只有一個時,將函數func作用於這個seq的每個元素上,並得到一個新的seq。
讓我們來看一下只有一個seq的時候,map()函數是如何工作的。
從上圖可以看出,函數func函數會作用於seq中的每個元素,得到func(seq[n])組成的列表。下面舉得例子來幫助我們更好的理解這個工作過程。
#使用lambda
>>> print map(lambda x: x % 2, range(7))
[0, 1, 0, 1, 0, 1, 0]123123
#使用列表解析
>>> print [x % 2 for x in range(7)]
[0, 1, 0, 1, 0, 1, 0]123123
一個seq時,可以使用filter()函數代替,那什麼情況不能代替呢?
2、當seq多於一個時,map可以並行(注意是並行)地對每個seq執行如下圖所示的過程:
從圖可以看出,每個seq的同一位置的元素同時傳入一個多元的func函數之後,得到一個返回值,並將這個返回值存放在一個列表中。下面我們看一個有多個seq的例子:
>>> print map(lambda x , y : x ** y, [2,4,6],[3,2,1])
[8, 16, 6]1212
如果上面我們不使用map函數,就只能使用for循環,依次對每個位置的元素調用該函數去執行。還可以使返回值是一個元組。如:
>>> print map(lambda x , y : (x ** y, x + y), [2,4,6],[3,2,1])
[(8, 5), (16, 6), (6, 7)]1212
當func函數時None時,這就同zip()函數了,並且zip()開始取代這個了,目的是將多個列表相同位置的元素歸並到一個元組。如:
>>> print map(None, [2,4,6],[3,2,1])
[(2, 3), (4, 2), (6, 1)]1212
需要注意的是:
map無法處理seq長度不一致、對應位置操作數類型不一致的情況,這兩種情況都會報類型錯誤。如下圖:
3、使用map()函數可以實現將其他類型的數轉換成list,但是這種轉換也是有類型限制的,具體什麼類型限制,在以後的學習中慢慢摸索吧。這里給出幾個能轉換的例子:
***將元組轉換成list***
>>> map(int, (1,2,3))
[1, 2, 3]
***將字元串轉換成list***
>>> map(int, '1234')
[1, 2, 3, 4]
***提取字典的key,並將結果存放在一個list中***
>>> map(int, {1:2,2:3,3:4})
[1, 2, 3]
***字元串轉換成元組,並將結果以列表的形式返回***
>>> map(tuple, 'agdf')
[('a',), ('g',), ('d',), ('f',)]
#將小寫轉成大寫
def u_to_l (s):
return s.upper()
print map(u_to_l,'asdfd')
Ⅷ Python實現彩色散點圖繪制(利用色帶對散點圖進行顏色渲染)
接受自己的普通,然後全力以赴的出眾,告訴自己要努力,但不要著急....
當然, 這個結果並不是我真正想要的,Pass, 太丑了!
好吧,安排,我們先看下實現後的效果!
這個效果自然就比之前的好多了!
實現python散點圖繪制需要用到matplotlib庫, matplotlib庫是專門用於可握沒視化繪圖的汪旅工具庫;學習一個新的庫當然看官方文檔了: https://www.osgeo.cn/matplotlib/contents.html
實現思路:
matplotlib.pyplot.scatter() 函數是專門繪制散點圖的函數: https://www.osgeo.cn/matplotlib/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=scatter#matplotlib.pyplot.scatter
matplotlib.pyplot.scatter ( x, y , s=None , c=None , marker=None , cmap=None , norm=None , vmin=None , vmax=None , alpha=None , linewidths=None , verts=None , edgecolors=None , ***, data=None , ** kwargs ) **
plt.scatter(observation, estimate, c=Z1, cmap=colormap, marker=".", s=marker_size, norm=colors.LogNorm(vmin=Z1.min(), vmax=0.5 * Z1.max()))
其中:
1、c參數為計算的散點密度;
2、cmap為色帶(matplotlib裡面自帶了很多色帶可供選擇),參見:
https://www.osgeo.cn/matplotlib/gallery/color/colormap_reference.html
3、由於計算的散點密度數值大小分散,因此利用norm參數對散點密度Z1進行歸一化處理(歸一化方式很多,參見colors類),並給歸一化方式設置色帶刻度的最大最小值vmin和vmax(一般這兩個參數就是指定散點密度的最小值和最大值),這樣就建立起了密度與色帶的映射關系。
https://matplotlib.org/tutorials/colors/colormapnorms.html
(這里的結果與前面展示的相比改變了計算散點密度的半徑:radius = 3以及繪制散點圖的散點大小marksize)困皮凳
作者能力水平有限,歡迎各位批評指正!
Ⅸ python 中的map(轉載)
1 map()函數的簡介以及語法:
map是python內置函數,會根據提供的函數對指定的序列做映射。
map()函數的格式是:
map(function,iterable,...)
第一個參數接受一個函數名,後面的參數接受一個或多個可迭代的序列,返回的是一個集合。
把函數依次作用在list中的每一個元素上,得到一個新的list並返回。注意,map不改變原list,而是返回一個新list。
2 map()函數實例:
del square(x):
return x ** 2
map(square,[1,2,3,4,5]) ---- -要列印結果需要 print(*map(square,[1,2,3,4,5])),這塊列印了再列印就會為空
# 結果如下:
[1,4,9,16,25]
通過使用lambda匿名函數的方法使用map()函數:
map(lambda x, y: x+y,[1,3,5,7,9],[2,4,6,8,10])
# 結果如下:
[3,7,11,15,19]
通過lambda函數使返回值是一個元組:
map(lambdax, y : (x**y,x+y),[2,4,6],[3,2,1])
# 結果如下
[(8,5),(16,6),(6,7)]
當不傳入function時,map()就等同於zip(),將多個列表相同位置的元素歸並到一個元組:
map(None,[2,4,6],[3,2,1])
# 結果如下
[(2,3),(4,2),(6,1)]
通過map還可以實現類型轉換
將元組轉換為list:
map(int,(1,2,3))
# 結果如下:
[1,2,3]
將字元串轉換為list:
map(int,'1234')
# 結果如下:
[1,2,3,4]
提取字典中的key,並將結果放在一個list中:
map(int,{1:2,2:3,3:4})
# 結果如下
[1,2,3]
原文鏈接:https://blog.csdn.net/quanlingtu1272/article/details/95482253
Ⅹ 利用Python實現卷積神經網路的可視化
在本文中,將探討如何可視化卷積神經網路(CNN),該網路在計算機視覺中使用最為廣泛。首先了解CNN模型可視化的重要性,其次介紹可視化的幾種方法,同時以一個用例幫助讀者更好地理解模型可視化這一概念。
正如上文中介紹的癌症腫瘤診斷案例所看到的,研究人員需要對所設計模型的工作原理及其功能掌握清楚,這點至關重要。一般而言,一名深度學習研究者應該記住以下幾點:
1.1 理解模型是如何工作的
1.2 調整模型的參數
1.3 找出模型失敗的原因
1.4 向消費者/終端用戶或業務主管解釋模型做出的決定
2.可視化CNN模型的方法
根據其內部的工作原理,大體上可以將CNN可視化方法分為以下三類:
初步方法:一種顯示訓練模型整體結構的簡單方法
基於激活的方法:對單個或一組神經元的激活狀態進行破譯以了解其工作過程
基於梯度的方法:在訓練過程中操作前向傳播和後向傳播形成的梯度
下面將具體介紹以上三種方法,所舉例子是使用Keras深度學習庫實現,另外本文使用的數據集是由「識別數字」競賽提供。因此,讀者想復現文中案例時,請確保安裝好Kears以及執行了這些步驟。
研究者能做的最簡單的事情就是繪制出模型結構圖,此外還可以標注神經網路中每層的形狀及參數。在keras中,可以使用如下命令完成模型結構圖的繪制:
model.summary()_________________________________________________________________Layer (type) 滑稿宏 Output Shape Param #
=================================================================conv2d_1 (Conv2D) (None, 26, 26, 32) 320_________________________________________________________________conv2d_2 (Conv2D) 敬茄 (None, 24, 24, 64) 18496_________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64) 0_________________________________________________________________dropout_1 (Dropout) (None, 12, 12, 64) 0_________________________________________________________________flatten_1 (Flatten) (None, 9216) 0_________________________________________________________________dense_1 (Dense) (None, 128) 1179776_________________________________________________________________dropout_2 (Dropout) (None, 128) 0_________________________________________________________________preds (Dense) (None, 10) 信冊 1290
=================================================================Total params: 1,199,882Trainable params: 1,199,882Non-trainable params: 0
還可以用一個更富有創造力和表現力的方式呈現模型結構框圖,可以使用keras.utils.vis_utils函數完成模型體系結構圖的繪制。
另一種方法是繪制訓練模型的過濾器,這樣就可以了解這些過濾器的表現形式。例如,第一層的第一個過濾器看起來像:
top_layer = model.layers[0]plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray')
一般來說,神經網路的底層主要是作為邊緣檢測器,當層數變深時,過濾器能夠捕捉更加抽象的概念,比如人臉等。
為了理解神經網路的工作過程,可以在輸入圖像上應用過濾器,然後繪制其卷積後的輸出,這使得我們能夠理解一個過濾器其特定的激活模式是什麼。比如,下圖是一個人臉過濾器,當輸入圖像是人臉圖像時候,它就會被激活。
from vis.visualization import visualize_activation
from vis.utils import utils
from keras import activations
from matplotlib import pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 6)
# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'preds')
# Swap softmax with linear
model.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)
# This is the output node we want to maximize.filter_idx = 0
img = visualize_activation(model, layer_idx, filter_indices=filter_idx)
plt.imshow(img[..., 0])
同理,可以將這個想法應用於所有的類別,並檢查它們的模式會是什麼樣子。
for output_idx in np.arange(10):
# Lets turn off verbose output this time to avoid clutter and just see the output.
img = visualize_activation(model, layer_idx, filter_indices=output_idx, input_range=(0., 1.))
plt.figure()
plt.title('Networks perception of {}'.format(output_idx))
plt.imshow(img[..., 0])
在圖像分類問題中,可能會遇到目標物體被遮擋,有時候只有物體的一小部分可見的情況。基於圖像遮擋的方法是通過一個灰色正方形系統地輸入圖像的不同部分並監視分類器的輸出。這些例子清楚地表明模型在場景中定位對象時,若對象被遮擋,其分類正確的概率顯著降低。
為了理解這一概念,可以從數據集中隨機抽取圖像,並嘗試繪制該圖的熱圖(heatmap)。這使得我們直觀地了解圖像的哪些部分對於該模型而言的重要性,以便對實際類別進行明確的區分。
def iter_occlusion(image, size=8):
# taken from https://www.kaggle.com/blargl/simple-occlusion-and-saliency-maps
occlusion = np.full((size * 5, size * 5, 1), [0.5], np.float32)
occlusion_center = np.full((size, size, 1), [0.5], np.float32)
occlusion_padding = size * 2
# print('padding...')
image_padded = np.pad(image, ( \ (occlusion_padding, occlusion_padding), (occlusion_padding, occlusion_padding), (0, 0) \ ), 'constant', constant_values = 0.0)
for y in range(occlusion_padding, image.shape[0] + occlusion_padding, size):
for x in range(occlusion_padding, image.shape[1] + occlusion_padding, size):
tmp = image_padded.()
tmp[y - occlusion_padding:y + occlusion_center.shape[0] + occlusion_padding, \
x - occlusion_padding:x + occlusion_center.shape[1] + occlusion_padding] \ = occlusion
tmp[y:y + occlusion_center.shape[0], x:x + occlusion_center.shape[1]] = occlusion_center yield x - occlusion_padding, y - occlusion_padding, \
tmp[occlusion_padding:tmp.shape[0] - occlusion_padding, occlusion_padding:tmp.shape[1] - occlusion_padding]i = 23 # for exampledata = val_x[i]correct_class = np.argmax(val_y[i])
# input tensor for model.predictinp = data.reshape(1, 28, 28, 1)# image data for matplotlib's imshowimg = data.reshape(28, 28)
# occlusionimg_size = img.shape[0]
occlusion_size = 4print('occluding...')heatmap = np.zeros((img_size, img_size), np.float32)class_pixels = np.zeros((img_size, img_size), np.int16)
from collections import defaultdict
counters = defaultdict(int)for n, (x, y, img_float) in enumerate(iter_occlusion(data, size=occlusion_size)):
X = img_float.reshape(1, 28, 28, 1)
out = model.predict(X)
#print('#{}: {} @ {} (correct class: {})'.format(n, np.argmax(out), np.amax(out), out[0][correct_class]))
#print('x {} - {} | y {} - {}'.format(x, x + occlusion_size, y, y + occlusion_size))
heatmap[y:y + occlusion_size, x:x + occlusion_size] = out[0][correct_class]
class_pixels[y:y + occlusion_size, x:x + occlusion_size] = np.argmax(out)
counters[np.argmax(out)] += 1
正如之前的坦克案例中看到的那樣,怎麼才能知道模型側重於哪部分的預測呢?為此,可以使用顯著圖解決這個問題。顯著圖首先在這篇文章中被介紹。
使用顯著圖的概念相當直接——計算輸出類別相對於輸入圖像的梯度。這應該告訴我們輸出類別值對於輸入圖像像素中的微小變化是怎樣變化的。梯度中的所有正值告訴我們,像素的一個小變化會增加輸出值。因此,將這些梯度可視化可以提供一些直觀的信息,這種方法突出了對輸出貢獻最大的顯著圖像區域。
class_idx = 0indices = np.where(val_y[:, class_idx] == 1.)[0]
# pick some random input from here.idx = indices[0]
# Lets sanity check the picked image.from matplotlib import pyplot as plt%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 6)plt.imshow(val_x[idx][..., 0])
from vis.visualization import visualize_saliency
from vis.utils import utilsfrom keras import activations# Utility to search for layer index by name.
# Alternatively we can specify this as -1 since it corresponds to the last layer.
layer_idx = utils.find_layer_idx(model, 'preds')
# Swap softmax with linearmodel.layers[layer_idx].activation = activations.linear
model = utils.apply_modifications(model)grads = visualize_saliency(model, layer_idx, filter_indices=class_idx, seed_input=val_x[idx])
# Plot with 'jet' colormap to visualize as a heatmap.plt.imshow(grads, cmap='jet')
# This corresponds to the Dense linear layer.for class_idx in np.arange(10):
indices = np.where(val_y[:, class_idx] == 1.)[0]
idx = indices[0]
f, ax = plt.subplots(1, 4)
ax[0].imshow(val_x[idx][..., 0])
for i, modifier in enumerate([None, 'guided', 'relu']):
grads = visualize_saliency(model, layer_idx, filter_indices=class_idx,
seed_input=val_x[idx], backprop_modifier=modifier)
if modifier is None:
modifier = 'vanilla'
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap='jet')
類別激活映射(CAM)或grad-CAM是另外一種可視化模型的方法,這種方法使用的不是梯度的輸出值,而是使用倒數第二個卷積層的輸出,這樣做是為了利用存儲在倒數第二層的空間信息。
from vis.visualization import visualize_cam
# This corresponds to the Dense linear layer.for class_idx in np.arange(10):
indices = np.where(val_y[:, class_idx] == 1.)[0]
idx = indices[0]f, ax = plt.subplots(1, 4)
ax[0].imshow(val_x[idx][..., 0])
for i, modifier in enumerate([None, 'guided', 'relu']):
grads = visualize_cam(model, layer_idx, filter_indices=class_idx,
seed_input=val_x[idx], backprop_modifier=modifier)
if modifier is None:
modifier = 'vanilla'
ax[i+1].set_title(modifier)
ax[i+1].imshow(grads, cmap='jet')
本文簡單說明了CNN模型可視化的重要性,以及介紹了一些可視化CNN網路模型的方法,希望對讀者有所幫助,使其能夠在後續深度學習應用中構建更好的模型。 免費視頻教程:www.mlxs.top