關注公眾號:【小張Python】,為你准備了 50+ 本Python 精品電子書籍 與 50G + 優質視頻學習資料,后台回復關鍵字:1024 即可獲取;如果對博文內容有什么疑問,公眾號后台添加作者【個人微信】,可與作者直接進行交流
Numpy 中導入數據方式有多種,其中函數之一為 genfromtxt ,genformtxt 相對其他函數有自己的優勢和劣勢,
- 劣勢:相對其它函數數據加載慢,從數據讀入到返回需要兩個迭代循環,第一個迭代將文件中每一行轉化為一個字符串序列,第二個循環迭代對每個字符串序列指定合適的數據類型;源於這兩個迭代原因,相對其它函數會慢一點;
- 優勢:更靈活,數據加載時會能夠處理丟失數據,例如對某些 missing_values 做一些數據填充,或將某一列數據從一中形式轉化為另一種形式;
函數語法如下:
genfromtxt(fname,dtype,comments,delimiter,skipd_header,skip_fonter,converters,missing_values,filling_values,usecols,names, autostrip,**kwarg)
-
fname -> str/list /IO Object 等等,表示數據源;文件路徑,字符串列表、StringIO 對象都可;
-
dtype -> dtype,最終數組的數據類型;
-
comments -> str,注釋標識符,加載時會自動忽略位於注釋標識符后面的字符串;
-
delimiter -> str/int/sequence,分割符,加載時來分割字符串,比較常見的就是逗號,也可以指定 int 整形表示每一個元素最大寬度;也可以是字符列表,表示分割符可為多個字符;
-
skip_header -> int,數據加載時跳過文件頭部的字符行數;
-
skip_footer -> int,數據加載時跳過文件尾部字符串行數;
-
converters -> variable,可以是字典形式也可以是 lambda 函數,表示將某一種數據格式轉化為另一種數據格式;
-
missing_values -> variable,指定數組中 missing value;
-
filling_values -> variable,指定 filling_values,來替代 missing_value;
-
usercols -> sequence,指定需讀取的列數, 0 表示第一列,-1 為最后一列;
上面列舉出各參數基本用法后,下面將針對里面每個參數,結合實例詳細介紹其用法
fname 參數
入的 fname 是以 gz 結尾的話,讀取時會在加載數據之前自動解壓,但較為常見的都是 txt 文本
delimiter參數
當 delimiter 為字符時,表示分割符,元素以分割符進行分割
>>> data = u"1, 2, 3\n4, 5, 6"
>>> np.genfromtxt(StringIO(data), delimiter=",")
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
當 delimiter 表示整數元組時,代表每一列所在元素最大寬度;如下定義了每一列元素最大寬度分別為4,3,2;
>>> data = u" 1 2 3\n 4 5 67\n890123 4"
>>> np.genfromtxt(StringIO(data), delimiter=3)
array([[ 1., 2., 3.],
[ 4., 5., 67.],
[ 890., 123., 4.]])
>>> data = u"123456789\n 4 7 9\n 4567 9"
>>> np.genfromtxt(StringIO(data), delimiter=(4, 3, 2))
array([[ 1234., 567., 89.],
[ 4., 7., 9.],
[ 4., 567., 9.]])
autostrip 參數
對於每行字符串用 分割符分割后,得到的單個元素可能會含有一些制表符或空格等標識符;autostrip 參數設為 True,元素中的空格標識符會被自動刪除~
>>> data = u"1, abc , 2\n 3, xxx, 4"
>>> # Without autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5")
array([['1', ' abc ', ' 2'],
['3', ' xxx', ' 4']], dtype='<U5')
>>> # With autostrip
>>> np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5", autostrip=True)
array([['1', 'abc', '2'],
['3', 'xxx', '4']], dtype='<U5')
comments 參數
comments表示注釋標識符,指定后注釋標識符所在行后面的字符會被自動省略,如下:
>>> data = u"""#
... # Skip me !
... # Skip me too !
... 1, 2
... 3, 4
... 5, 6 #This is the third line of the data
... 7, 8
... # And here comes the last line
... 9, 0
... """
>>> np.genfromtxt(StringIO(data), comments="#", delimiter=",")
array([[1., 2.],
[3., 4.],
[5., 6.],
[7., 8.],
[9., 0.]])
skip_header,skip_footer
讀取數據時,可能前幾行后者后幾行的數據我們不需要,此時設定 skip_header、skip_footer 參數即可,例如讀取時 想過濾數據列表中 前三行、后五行數據,此時參數設定時 skip_header=3,skip_footer=5
即可
>>> data = u"\n".join(str(i) for i in range(10))
>>> np.genfromtxt(StringIO(data),)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
>>> np.genfromtxt(StringIO(data),
... skip_header=3, skip_footer=5)
array([ 3., 4.])
usecols
usecols 參數來指定只讀取數據中指定的列,與數組索引用法相似,下面是只提取原數據中第一列和最后一列數據:
>>> data = u"1 2 3\n4 5 6"
>>> np.genfromtxt(StringIO(data), usecols=(0, -1))
array([[ 1., 3.],
[ 4., 6.]])
converters
converters 用來對數組中一些數據進行格式替換,以字典形式定義 key 表示需要數據轉化的列索引,value 為轉換函數,下面實例中將百分比轉化為浮點型
>>> data = u"1, , 3\n 4, 5, 6"
>>> convert = lambda x: float(x.strip() or -999)
>>> np.genfromtxt(StringIO(data), delimiter=",",
... converters={1: convert})
array([[ 1., -999., 3.],
[ 4., 5., 6.]])
missing_values,filling_values
讀取的數據中一般出現缺失值,而這些缺失值有時對最終分析結果影響很大,我們需要做的就是將這些缺失值用某些值來代替,這里就需要用到 missing_values 、filling_values ,前者標記缺失值,后者對missing_values 進行填充 ,
例如下面的實例,分別將 0,1,2 列數據中的 'N/A'、空格、‘???’ 替換為 0,0,-999;
>>> data = u"N/A, 2, 3\n4, ,???"
>>> kwargs = dict(delimiter=",",
... dtype=int,
... names="a,b,c",
... missing_values={0:"N/A", 'b':" ", 2:"???"},
... filling_values={0:0, 'b':0, 2:-999})
>>> np.genfromtxt(StringIO(data), **kwargs)
array([(0, 2, 3), (4, 0, -999)],
dtype=[('a', '<i8'), ('b', '<i8'), ('c', '<i8')])