簡體   English   中英

在帶有冒號分隔數字的文本文件上使用numpy.fromregex

[英]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))

結果

在此處輸入圖片說明

意見建議

使用@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM