2014-10-28 55 views
1

我知道下面的代碼使用它自己的標記繪製了散點圖。我無法理解轉換器功能。無法理解Matplot庫中的代碼

轉換器函數的一般定義是: 將列號映射到將該列轉換爲浮點數的函數的字典。例如,如果列0是日期字符串:轉換器= {0:datestr2num}。轉換器也可用於爲缺失數據提供缺省值(但也可參見genfromtxt):轉換器= {3:lambda s:float(s.strip()或0)}。默認值:無。

但我無法理解它在下面的代碼中的作用; read_label函數做什麼?

import numpy as np 
import matplotlib.pyplot as plt 
label_list = (
b'Iris-setosa', 
b'Iris-versicolor', 
b'Iris-virginica', 
) 
def read_label(label): 
    return label_list.index(label) 

data = np.loadtxt('iris.data.txt', delimiter = ',', converters = { 4 : read_label }) 

marker_set = ('^', 'x', '.') 

for i, marker in enumerate(marker_set): 
    data_subset = numpy.asarray([x for x in data if x[4] == i]) 

plt.scatter(data_subset[:,0], data_subset[:,1], color = 'k', marker = marker) 
plt.show() 

的iris.data.txt文件由以下的數據:

4.6,3.2,1.4,0.2,虹膜setosa 5.3,3.7,1.5,0.2,虹膜setosa 5.0,3.3 ,1.4,0.2,虹膜setosa 7.0,3.2,4.7,1.4,虹膜雲芝 6.4,3.2,4.5,1.5,虹膜雲芝

回答

1

您可以輕鬆地調查read_label的行爲有一個小測試程序:

label_list = (
b'Iris-setosa', 
b'Iris-versicolor', 
b'Iris-virginica', 
) 

def read_label(label): 
    return label_list.index(label) 

print read_label("Iris-setosa") 
print read_label("Iris-versicolor") 
print read_label("Iris-virginica") 

輸出:

0 
1 
2 

或者你look up Python's index method:它返回給定元素的列表索引。

請注意,如果您要求列表中不存在的元素,您將得到一個ValueError。在這種情況下,您可能需要使用find

+0

雅我知道了,但轉換器在這裏做什麼。我無法理解 - 轉換器= {4:read_label} – MJP 2014-10-29 05:28:57

+0

@ user3796494:它告訴'loadtext'將'read_label'應用於列號4.因此該列中的每個字符串都將被轉換爲'label_list'中的對應索引。 – Falko 2014-10-29 06:00:20