4

3000x300のマトリックスファイル(フロート)があります。読んでfloatに変換すると、Pythonのデフォルトであるfloat64が表示されます。numpyとmap()を試してfloat32()に変換しようとしましたが、どちらも非常に非効率的です。

私のコード:

x = open(readFrom, 'r').readlines()
y = [[float(i) for i in s.split()] for s in x]

所要時間:0:00:00.996000

numpyの実装:

x = open(readFrom, 'r').readlines()
y = [[np.float32(i) for i in s.split()] for s in x]

所要時間:0:00:06.093000

地図()

x = open(readFrom, 'r').readlines()
y = [map(np.float32, s.split()) for s in x]

所要時間:0:00:05.474000

どうすればfloat32に非常に効率的に変換できますか?

ありがとうございました。

Update:

numpy.loadtxt()またはnumpy.genfromtxt()巨大なファイルに対して機能しない(メモリエラーを与える)。これに関連する質問を投稿しました。ここで紹介したアプローチは、巨大なマトリックスファイル(50,000x5000)でうまく機能します。ここに質問があります

4

1 に答える 1

2

メモリが問題であり、フィールドのサイズを事前に知っている場合は、そもそもファイル全体を読みたくないでしょう。このようなものがおそらくより適切です:

#allocate memory (np.empty would work too and be marginally faster, 
#                 but probably not worth mentioning).
a=np.zeros((3000,300),dtype=np.float32)  
with open(filename) as f:
    for i,line in enumerate(f):
        a[i,:]=map(np.float32,line.split()) 

私のマシンでのいくつかの簡単な(そして驚くべき)テストから、はmap必要ないかもしれないようです:

a=np.zeros((3000,300),dtype=np.float32)  
with open(filename) as f:
    for i,line in enumerate(f):
        a[i,:]=line.split() 

これは最速ではないかもしれませんが、確かにそれを行うための最もメモリ効率の良い方法になります。

いくつかのテスト:

import numpy as np

def func1():   #No map -- And pretty speedy :-).
    a=np.zeros((3000,300),dtype=np.float32)
    with open('junk.txt') as f:
        for i,line in enumerate(f):
            a[i,:]=line.split()

def func2():
    a=np.zeros((3000,300),dtype=np.float32)
    with open('junk.txt') as f:
        for i,line in enumerate(f):
            a[i,:]=map(np.float32,line.split())

def func3():
    a=np.zeros((3000,300),dtype=np.float32)
    with open('junk.txt') as f:
        for i,line in enumerate(f):
            a[i,:]=map(float,line.split())

import timeit

print timeit.timeit('func1()',setup='from __main__ import func1',number=3)  #1.36s
print timeit.timeit('func2()',setup='from __main__ import func2',number=3)  #11.53s
print timeit.timeit('func3()',setup='from __main__ import func3',number=3)  #1.72s
于 2012-07-17T18:05:39.203 に答える