[英]Using numpy.fromregex on a text file with colon separated digits
我有一個看起來像這樣的數據集:
# sparse.txt
1 1:1 2:1 3:1
0 1:1 4:1
1 12:1 13:1 14:1
我想創建一個沒有冒號的矩陣,如下所示:
# sparse2.txt
1 1 1 2 1 3 1
0 1 1 4 1
1 2 1 3 1 4 1
我使用在線python正則表達式來查找正則表達式模式以讀取文件的行。 https://pythex.org/
我使用了模式:
pat = [0-1]\s+([0-9]:1\s*)+
滿足在線正則表達式中的正則表達式,但是當我在np.fromregex中使用它時,它不起作用。
import numpy as np
pat = r'[0-1]\s+([0-9]:1\s*)+'
data = np.fromregex('sparse.txt', pat, dtype='str')
print("data = {}".format(data))
我們如何解決該錯誤?
[0-1]\\s+([0-9]:1\\s*)+
import numpy as np
pat = r'^\d|[^0-9\:\n][\d]?'
data = np.fromregex('sparse.txt', pat, [('num', np.int64)])
print("data = {}".format(data))
numpy.fromregex
官方參考鏈接 使用@Wiktor的模式
In [58]: pat1 = r'([0-1])\s+([0-9]):(1)\s+([0-9]):(1)(?:\s+([0-9]):(1))?'
In [59]: np.fromregex('stack47266965.txt', pat1, dtype='str')
Out[59]:
array([['1', '1', '1', '2', '1', '3', '1'],
['0', '1', '1', '4', '1', '', ''],
['1', '2', '1', '3', '1', '4', '1']],
dtype='<U1')
這是dtype字符串的二維數組(此處為unicode); 注意第二行短的填充。 這是由模式的?:
部分產生的。
fromregex
執行re.findall
並將該元組列表轉換為數組:
In [60]: re.findall(pat1, open('stack47266965.txt').read())
Out[60]:
[('1', '1', '1', '2', '1', '3', '1'),
('0', '1', '1', '4', '1', '', ''),
('1', '2', '1', '3', '1', '4', '1')]
注意fromregex
文檔強調它返回一個structured array
。 該元組列表可以是np.array(seq, dtype=dt)
的正確輸入,其中dt
是復合dtype。 每個元組應具有相同的長度,該長度應與dtype
相匹配。
這種情況表明,它可以與類似str
的簡單dtype一起使用。 但這對您有什么作用。 您不能將這些字符串轉換為數字,而無需以某種方式過濾掉空格。 沒有空白,數組將不再是二維的。 中間那條短線阻止了這種情況。
numpy
中的文本文件閱讀器旨在逐行讀取文件,將每個文件閱讀器解析為2d數組的一行或1d結構化數組的記錄。 不規則的線長是一個問題,需要某種填充。
@XetRAFHan的模式提取所需的所有數字,但會刪除行結構:
In [93]: pat2 = r'^\d|[^0-9\:\n][\d]?'
In [94]: re.findall(pat2, open('stack47266965.txt').read())
Out[94]: ['1', ' 1', ' 2', ' 3', ' 1', ' 4', ' 2', ' 3', ' 4']
您之前進行的拆分類型保留了文件結構
有效地從稀疏矩陣創建密集矩陣(numpy / scipy,但沒有sklearn)
In [95]: lines = open('stack47266965.txt').readlines()
In [96]: lines
Out[96]: ['1 1:1 2:1 3:1\n', '0 1:1 4:1\n', '1 2:1 3:1 4:1\n']
In [97]: alist = []
In [98]: for line in lines:
...: row = line.split()
...: label = int(row[0])
...: values = [int(a.split(':')[0]) for a in row[1:]]
...: alist.append((label, values))
...:
In [99]: alist
Out[99]: [(1, [1, 2, 3]), (0, [1, 4]), (1, [2, 3, 4])]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.