當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python NumPy genfromtxt方法用法及代碼示例


Numpy 的 genfromtext(~) 方法讀取文本文件,並將其內容解析為 Numpy 數組。與 Numpy 的 loadtxt(~) 方法不同,genfromtxt(~) 適用於缺失的數字。

參數

1. fname | string

文件的名稱。如果該文件與腳本不在同一目錄中,請確保也包含該文件的路徑。

2. dtype | stringtypelist<string>list<type> | optional

所構造數組所需的數據類型。默認情況下,dtype=float64 。這意味著所有整數也將轉換為浮點數。

如果您設置 dtype=None ,那麽 Numpy 將嘗試從您的值推斷類型。這可能比您自己設置類型要慢得多。

3. comments | string | optional

如果您的輸入文件包含注釋,那麽您可以指定標識注釋的內容。默認情況下, comments="#" ,即同一行中 # 後麵的字符將被視為注釋。如果您的文本文件不包含任何注釋,您可以設置None

4. delimiter | string | optional

用於分隔數據的字符串。默認情況下,分隔符是空格。

5. skiprows | int | optional

在 Numpy 1.10 版本中,該參數已被 skip_header 取代。

6. skip_header | int | optional

開頭要跳過的行數。請注意,這包括評論。默認情況下,skiprows=0

7. skip_footer | int | optional

最後要跳過的行數。請注意,這包括評論。默認情況下,skiprows=0

8. converters | dict<int,function> | optional

您可以應用映射來轉換列值。鍵是列的整數索引,值是所需的映射。檢查下麵的示例以進行說明。默認情況下,dict=None

9. missing | string | optional

在 Numpy 1.10 版本中,該參數已被 missing_values 取代。

10.missing_values | stringsequence<string> | optional

將被視為缺失值的字符串序列。這僅在 usemask=True 時相關。請參閱示例以進行澄清。

11.filling_values | valuedictsequence<value> | optional

如果傳遞單個值,則所有缺失值和無效值都將被該值替換。通過傳遞一個字典,您可以為不同的列指定不同的填充值。鍵是列整數索引,值是該列的填充值。

12.usecols | intsequence | optional

您要讀取的列的整數索引。默認情況下, usecols=None ,即讀取所有列。

13.names | NoneTruestringsequence<string> | optional

結果數組的字段名稱。此參數僅與那些希望創建結構化數組的人相關。

類型

說明

None

將返回標準數組而不是結構化數組。

True

指定的 skip_header 行之後的第一行將被視為字段名稱。

string

包含以逗號分隔的字段名稱的單個字符串。

sequence

包含字段名稱的類似數組的結構。

默認情況下,names=None

附帶說明一下,結構化數組並不常用,因為 Pandas 庫中的 Series 和 DataFrames 是更好的選擇。

14.excludelist | sequence | optional

傳遞的字符串將附加到默認列表 ["return", "file", "print"] 中。請注意,下劃線將附加到傳遞的字符串中(例如,如果傳遞"abc",則"abc_"將附加到默認列表中)。這僅與那些希望創建結構化數組的人相關。

15.deletechars | string 長度為 1 或 sequencedict | optional

要從名稱中刪除的字符。

16.defaultfmt | string | optional

結果字段名稱的格式。語法遵循 Python 標準字符串格式化程序的語法:

17.autostrip | boolean | optional

是否刪除值中的前導和尾隨。這僅適用於字符串值。默認情況下,autostrip=False

18.replace_space | string | optional

用於替換字段名稱中的空格的字符串。請注意,前導和尾隨空格將被刪除。默認情況下,replace_space="_"

19.case_sensitive | stringboolean | optional

如何處理字符串字符的大小寫。

說明

True

保持 shell 原樣。

False

將值轉換為大寫。

"upper"

將值轉換為大寫。

"lower"

將值轉換為小寫。

默認情況下,case_sensitive=True

20.unpack | boolean | optional

您可以通過將其設置為 True 來單獨檢索列數組,而不是使用一個巨大的 Numpy 數組。例如,col_one, col_two = np.genfromtxt(~, unpack=True) 。默認情況下,unpack=False

21.usemask | boolean | optional

是否返回掩碼布爾數組。默認情況下,usemark=True

22.loose | boolean | optional

如果為 True,則無效值將轉換為 nan 並且不會引發錯誤。默認情況下,loose=True

23.invalid_raise | boolean | optional

如果行中的值數與列數不匹配,則會引發錯誤。如果設置為 False,則將從結果數組中省略無效行。默認情況下,invalid_raise=True

24.max_rows | int | optional

要讀取的最大行數。默認情況下,讀取所有行。

25.encoding | string | optional

讀取文件時使用的編碼(例如"latin-1"、"iso-8859-1")。默認編碼="bytes"。

返回值

包含導入數據的 Numpy 數組。

例子

基本用法

假設我們有以下名為 my_data.txt 的 text-file :

1 2 3 4
5 6 7 8

要導入此文件:

a = np.genfromtxt("my_data.txt")
a



array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]])

請注意,此 Python 腳本與 my_data.txt 位於同一目錄中。

另外,無論文本文件中的數字是否都是整數,默認數據類型都是 float64

print(a.dtype)



float64

指定所需的數據類型

再次假設我們有以下名為 my_data.txt 的 text-file :

1 2 3 4
5 6 7 8

我們可以使用 dtype 指定類型,而不是使用默認的 float64

a = np.genfromtxt("my_data.txt", dtype=int)
a



array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

現在,所有值的類型均為 float64

您還可以傳遞類型列表以將不同類型分配給不同的列:

a = np.genfromtxt("my_data.txt", dtype=[np.int,32 int, np.float,32 float])
a



array([(1, 2, 3., 4.), (5, 6, 7., 8.)],
       dtype=[('f0', '<i4'), ('f1', '<i8'), ('f2', '<f4'), ('f3', '<f8')])

這裏,i4代表int32,而i8代表int64

請注意,這是一種特殊類型的 Numpy 數組,稱為結構化數組。這種類型的數組在實踐中並不經常使用,因為 Pandas 庫中的 Series 和 DataFrames 是具有更多函數的替代方案。

指定自定義分隔符

假設我們的my_data.txt文件如下:

1,2
3,4

由於我們的數據是逗號分隔的,因此設置delimiter=","如下:

a = np.genfromtxt("my_data.txt", delimiter=",")
a



1,2
3,4

處理評論

假設我們的my_data.txt文件如下:

1,2,3,4    / I'm the first row!
5,6,7,8    / I'm the second row!

要刪除 text-file 中的注釋,請指定 comments

a = np.genfromtxt("my_data.txt", delimiter=",", comments="/")
a



array([[1., 2., 3., 4.],
       [5., 6., 7., 8.]])

指定skip_header

假設我們的my_data.txt文件如下:

1 2 3
4 5 6
7 8 9

要跳過第一行:

a = np.genfromtxt("my_data.txt", skip_header=1)
a



array([[4., 5., 6.],
       [7., 8., 9.]])

假設我們的my_data.txt文件如下:

1 2 3
4 5 6
7 8 9

要跳過最後一行:

a = np.genfromtxt("my_data.txt", skip_footer=1)
a



array([[1., 2., 3.],
       [4., 5., 6.]])

指定轉換器

假設我們的my_data.txt文件如下:

1 2
3 4

舉個任意的例子,假設我們想將第一列的所有值加 10,並使第二列的所有值都為 20:

a = np.genfromtxt("my_data.txt", converters={0: lambda x: int(x) + 10, 1: lambda x: 20})
a



array([(11, 20),
       (13, 20)], dtype=[('f0', '<i8'), ('f1', '<i8')])

這裏,"f0""f1"是字段名稱,並且"i8"表示int64數據類型。

指定missing_values

假設我們的my_data.txt文件如下:

3,??
,6

所有缺失和無效的值都被視為 nan ,因此您不需要在此處指定 missing_values="??"

a = np.genfromtxt("my_data.txt", delimiter=",")
a



array([[ 3., nan],
       [nan,  6.]])

請注意,無法將值 6 設置為缺失值。僅當您設置 usemask=True 時, missing_values 才會發揮作用。

這是沒有 missing_valuesusemask=True

a = np.genfromtxt("my_data.txt", delimiter=",", usemask=True)
a



masked_array(
   data=[[3.0, nan],
         [--, 6.0]],
   mask=[[False, False],
         [ True, False]],
   fill_value=1e+20)

請注意此處如何區分缺失值和無效值 - ?? 已映射到 nan,掩碼布爾值標記為 False ,而實際缺失值已映射到 --,掩碼布爾值設置為 True.

現在,這是 usemask=Truemissing_values="??"

a = np.genfromtxt("my_data.txt", delimiter=",", missing_values="??", usemask=True)
a



masked_array(
   data=[[3.0, --],
         [--, 6.0]],
   mask=[[False,  True],
         [ True, False]],
   fill_value=1e+20)

這裏的關鍵是, ?? 本質上是一個無效值,現在被視為 missing_value 。

指定filling_values

默認情況下,所有缺失和無效的值都將替換為 nan。要更改此設置,請指定 filling_values,如下所示:

a = np.genfromtxt("my_data.txt", delimiter=",", filling_values=0)
a



array([[3., 0.],
       [0., 6.]])

您還可以傳入一個字典,其中包含以下鍵值對:

  • key:列整數索引

  • value:填充值

例如,設置將第一列的所有缺失值和無效值映射到 -1,將第二列的所有缺失值和無效值映射到 -2:

a = np.genfromtxt("my_data.txt", delimiter=",", filling_values={0:-1, 1:-2})
a



array([[ 3., -2.],
       [-1.,  6.]])

隻讀取某些列

假設我們的my_data.txt文件如下:

1 2 3
4 5 6

僅讀取第一列和第三列(即列索引 0 和 2):

a = np.genfromtxt("my_data.txt", usecols=[0,2])
a



array([[1., 3.],
       [4., 6.]])

指定名稱

假設我們的my_data.txt文件如下:

3 4
5 6

為每列指定名稱:

a = np.genfromtxt("my_data.txt", names=("A","B"))
a



array([(3., 4.),
       (5., 6.)],
       dtype=[('A', '<f8'), ('B', '<f8')])

在這裏,我們將名稱 A 分配給第一列。請注意, f8 僅表示類型 float64

指定排除列表

假設我們的my_data.txt文件如下:

3 4 5
6 7 8

要將 _ 附加到某些名稱:

a = np.genfromtxt("my_data.txt", names=["A","B","C"], excludelist=["A"])
a



array([(3., 4., 5.), (6., 7., 8.)],
      dtype=[('A_', '<f8'), ('B', '<f8'), ('C', '<f8')])

請注意我們如何將 A_ 作為第一列的字段名稱。

指定刪除字符

假設我們的my_data.txt文件如下:

3 4
5 6

要從字段名稱中刪除字符 "c"

a = np.genfromtxt("my_data.txt", names=["Ab","BcD"], deletechars="c")
a



array([(3., 4.), (5., 6.)], dtype=[('Ab', '<f8'), ('BD', '<f8')])

要刪除多個字符:

a = np.genfromtxt("my_data.txt", names=["Ab","BcD"], deletechars=["c","A"])
a



array([(3., 4.), (5., 6.)], dtype=[('b', '<f8'), ('BD', '<f8')])

指定defaultfmt

假設我們的my_data.txt文件如下:

3 4
5 6

如果返回結果是結構化數組,並且未定義 names 參數,則字段名稱默認采用 "f0""f1" 等值:

a = np.genfromtxt("my_data.txt", dtype=[int, float])
a



array([(3, 4.), (5, 6.)], dtype=[('f0', '<i8'), ('f1', '<f8')])

要對此進行自定義,請傳遞 defaultfmt 參數:

a = np.genfromtxt("my_data.txt", dtype=[int, float], defaultfmt="my_var_%i")
a



array([(3, 4.), (5, 6.)], dtype=[('my_var_0', '<i8'), ('my_var_1', '<f8')])

這裏,%i 是列整數索引的占位符。

指定自動刪除

假設我們的my_data.txt文件如下:

3,a, 4
 5 ,b c,6

默認情況下,值中出現的所有空格均保持不變:

a = np.genfromtxt("my_data.txt", delimiter=",", dtype="U")
a



array([['3', 'a', ' 4'],
       ['5 ', 'b c', '6']], dtype='<U5')

如果要去掉前導和尾隨空格,請設置autostrip=True,如下所示:

a = np.genfromtxt("my_data.txt", delimiter=",", autostrip=True, dtype="U")
a



array([['3', 'a', '4'],
       ['5', 'b c', '6']], dtype='<U3')

請注意 "b c" 中的空格仍然存在。

指定replace_space

假設我們的my_data.txt如下:

3 4
5 6

默認情況下,非前導和非尾隨空格替換為 _

a = np.genfromtxt("my_data.txt", names=["A B", " C "])
a



array([(3., 4.), (5., 6.)], dtype=[('A_B', '<f8'), ('C', '<f8')])

請注意前導空格和尾隨空格是如何被去除的。

要用自定義字符串替換空格,請設置 replace_space 參數,如下所示:

a = np.genfromtxt("my_data.txt", names=["A B", " C "], replace_space="K")
a



array([(3., 4.), (5., 6.)], dtype=[('AKB', '<f8'), ('C', '<f8')])

指定case_sensitive

假設我們的my_data.txt如下:

3 4
5 6

默認情況下,case_sensitive 設置為 True,這意味著字段名稱保持原樣。

a = np.genfromtxt("my_data.txt", names=["Ab", "dC"])
a



array([(3., 4.), (5., 6.)], dtype=[('Ab', '<f8'), ('dC', '<f8')])

要將字段名稱轉換為大寫,請設置 "upper"False

a = np.genfromtxt("my_data.txt", names=["Ab", "dC"], case_sensitive=False)
a



array([(3., 4.), (5., 6.)], dtype=[('AB', '<f8'), ('DC', '<f8')])

要將字段名稱轉換為小寫,請設置 "lower"

a = np.genfromtxt("my_data.txt", names=["Ab", "dC"], case_sensitive="lower")
a



array([(3., 4.), (5., 6.)], dtype=[('ab', '<f8'), ('dc', '<f8')])

指定解包

假設我們的my_data.txt文件如下:

1 2
3 4

要檢索每列的數據而不是單個 Numpy 數組:

col_one, col_two = np.genfromtxt("my_data.txt", unpack=True)
print("col_one:", col_one)
print("col_two:", col_two)



col_one: [3. 5.]
col_two: [4. 6.]

指定鬆散

假設我們的my_data.txt文件如下:

3 4
5 ??

默認情況下, loose=True ,這意味著無效值(例如此處的 ?? )將轉換為 nan

a = np.genfromtxt("my_data.txt")
a



array([[ 3.,  4.],
       [ 5., nan]])

如果我們的文件包含無效值,要引發錯誤,請設置 loose=False ,如下所示:

a = np.genfromtxt("my_data.txt", loose=False)
a



ValueError: Cannot convert string '??'

指定invalid_raise

假設我們的my_data.txt文件如下:

3,4
5
7,8

此處,盡管數組看似有 2 列,但第二行僅包含 1 個值。

默認情況下, invalid_raise=True ,這意味著如果文件包含無效行,則會引發錯誤:

a = np.genfromtxt("my_data.txt", delimiter=",")
a



ValueError: Some errors were detected!
    Line #2 (got 1 columns instead of 2)

我們可以通過將其設置為 False 來選擇忽略無效行,如下所示:

a = np.genfromtxt("my_data.txt", delimiter=",", invalid_raise=False)
a



array([[3., 4.],
       [7., 8.]])

不會引發任何錯誤,但 Numpy 足夠好,可以向我們發出警告:

ConversionWarning: Some errors were detected!
    Line #2 (got 1 columns instead of 2)

指定所需尺寸

假設我們的 sample.txt 隻有一行:

1 2 3 4

默認情況下,loadtxt(~) 將生成一個一維數組:

a = np.loadtxt("sample.txt")
a



array([1., 2., 3., 4.])

我們可以通過以下方式指定我們希望數組是二維的:

a = np.loadtxt("sample.txt", ndmin=2)
a



array([[1., 2., 3., 4.]])

指定max_rows

假設我們的my_data.txt文件如下:

1 2
3 4
5 6

僅讀取前兩行而不是整個文件:

a = np.genfromtxt("myy_data.txt", max_rows=2)
a



array([[1., 2.],
       [3., 4.]])

相關用法


注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 NumPy | genfromtxt method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。