[英]Loading each line of text file as numpy array without looping
我有包含用於頻繁規則挖掘的數據的數據集,其中每一行都有不同數量的項目,例如
9 10 5
8 9 10 5 12 15
7 3 5
有沒有一種方法可以一次讀取具有上述內容的文件並將其轉換為arrays
的numpy
array
,如 np.array(np.array([
array([array([ 9, 10, 5]), array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5])], dtype=object)
我遇到過numpy.loadtxt
function 但它不能滿足我想要的不同數量的列。 對於不同數量的列, loadtxt
需要提及用於讀取數據的列。 但是,我想讀取每一行中的所有值。
實現此目的的一種方法是手動讀取文件並將每一行轉換為numpy
'array`,但我不想采用這種方法,因為實際數據集將比此處顯示的小示例大得多。 例如,我打算使用來自FIMI 存儲庫的數據集。 一個樣本數據是事故數據。
編輯:我使用以下代碼來實現我想要的
data = []
# d = np.loadtxt('datasets/grocery.dat')
with open('datasets/accidents.dat', 'r') as f:
for l in f.readlines():
ar = np.genfromtxt(StringIO(l))
data.append(ar)
print(data)
data = np.array(data)
print(data)
但是,這是我要避免的:在 python 代碼中循環,因為讀取數據並將其轉換為numpy
arrays
需要超過四分鍾
In [401]: txt="""9 10 5
...: 8 9 10 5 12 15
...: 7 3 5
...: 9 10 5
...: 8 9 10 5 12 15
...: 7 3 5
...: 9 10 5
...: 8 9 10 5 12 15
...: 7 3 5""".splitlines()
(這近似於我們使用readlines
得到的結果)
收集列表列表很簡單,但是將字符串轉換為數字需要列表理解:
In [402]: alist = []
In [403]: for line in txt:
...: alist.append(line.split())
...:
In [404]: alist
Out[404]:
[['9', '10', '5'],
['8', '9', '10', '5', '12', '15'],
['7', '3', '5'],
['9', '10', '5'],
['8', '9', '10', '5', '12', '15'],
['7', '3', '5'],
['9', '10', '5'],
['8', '9', '10', '5', '12', '15'],
['7', '3', '5']]
In [405]: np.array(alist)
Out[405]:
array([list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
list(['7', '3', '5']), list(['9', '10', '5']),
list(['8', '9', '10', '5', '12', '15']), list(['7', '3', '5']),
list(['9', '10', '5']), list(['8', '9', '10', '5', '12', '15']),
list(['7', '3', '5'])], dtype=object)
將每一行轉換為 integer 數組可能會更快(但這只是一個猜測):
In [406]: alist = []
...: for line in txt:
...: alist.append(np.array(line.split(), dtype=int))
...:
...:
In [407]: alist
Out[407]:
[array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5]),
array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5]),
array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5])]
In [408]: np.array(alist)
Out[408]:
array([array([ 9, 10, 5]), array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5]), array([ 9, 10, 5]),
array([ 8, 9, 10, 5, 12, 15]), array([7, 3, 5]),
array([ 9, 10, 5]), array([ 8, 9, 10, 5, 12, 15]),
array([7, 3, 5])], dtype=object)
鑒於文本的不規則性質,以及結果中數組長度的混合,沒有太多的替代方案。 Arrays 或不同大小的列表是一個很好的指標,表明快速多維數組操作是不可能的。
我們可以將所有數字加載為一維數組:
In [413]: np.fromstring(' '.join(txt), sep=' ', dtype=int)
Out[413]:
array([ 9, 10, 5, 8, 9, 10, 5, 12, 15, 7, 3, 5, 9, 10, 5, 8, 9,
10, 5, 12, 15, 7, 3, 5, 9, 10, 5, 8, 9, 10, 5, 12, 15, 7,
3, 5])
但是將其拆分為 arrays 行仍然需要某種行數,然后是數組拆分。 所以我懷疑它是否會節省任何時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.