我有一個巨大的2d numpy數組,假設它是一個共生矩陣。我試圖使用scipy.sparse作爲我的數據結構,但dok_matrix
索引非常慢(速度慢4倍)。Python:如何有效地將2d numpy數組保存到磁盤?
# Impossible
import numpy
N = 1000000 (1 milion)
coo = np.zeros((N, N), dtype=np.uint32)
我想堅持這個數組。
找到保存方法之後,我嘗試使用PyTables
或hd5py
,但是找不到內存不足的方法來保存它。
with open(name, 'w') as _file:
np.save(_file, coo)
例如,使用PyTables
:
import tables
_file = tables.openFile(
name,
mode='w',
title='Co-occurrence matrix')
atom = tables.Atom.from_dtype(coo.dtype)
_filters = tables.Filters(complib='blosc', complevel=5)
ds = _file.createEArray(
_file.root,
'coo_matrix',
atom,
shape=(0, coo.shape[-1]),
expectedrows=coo.shape[-1],
filters=_filters)
# ds[:] = coo => not an option
for _index, _data in enumerate(coo):
ds.append(coo[_index][np.newaxis,:])
_file.close()
而且使用hd5py
:
import h5py
h5f = h5py.File(name, 'w')
h5f.create_dataset('dataset_1', data=coo)
這兩種方法都不斷增加內存的使用,直到我必須殺死進程。那麼,有什麼辦法可以逐步做到嗎?如果無法做到這一點,你能推薦另一種方法來堅持這個矩陣嗎?
編輯
我創建這個共生矩陣是這樣的:
coo = np.zeros((N, N), dtype=np.uint32)
for doc_id, doc in enumerate(self.w.get_docs()):
for w1, w2 in combinations(doc, 2):
if w1 != w2:
coo[w1, w2] += 1
我要救COO(2D numpy的陣列)以後從磁盤檢索,發現共現值,例如:coo [w1,w2]
只是爲了滿足我自己的好奇心:什麼是*後負荷*? –
除了存儲你想用這個數組做什麼?更改個人價值觀,訪問他們,訪問片,數學? – hpaulj
有['np.savez_compressed'選項](http://stackoverflow.com/a/18232374/832621),這是非常快速和緊湊的移動數據... –