2017-03-31 35 views
1

我有兩個3d numpy數組,稱它們爲a和b,512x512x512。我需要將它們寫入一個文本文件:在python中構建文本文件的更快方法

a1 b1 
a2 b2 
a3 b3 
... 

這可以用一個三重循環來完成:當我寧願幾秒鐘

lines = [] 
for x in range(nx): 
    for y in range(ny): 
     for z in range(nz): 
      lines.append('{} {}'.format(a[x][y][z], b[x][y][z]) 
print('\n'.join(lines)) 

但是,這是殘酷的慢(10分鐘一個mac pro)。

我正在使用python 3.6,最新的numpy,並且很高興使用其他庫,構建擴展,無論什麼是必要的。什麼是最好的方式來加快這一點?

回答

4

您可以使用np.stack和陣列重塑到(-1,2)(兩列)陣列,然後使用np.savetxt

a = np.arange(8).reshape(2,2,2) 
b = np.arange(8, 16).reshape(2,2,2) 

np.stack([a, b], axis=-1).reshape(-1, 2) 

#array([[ 0, 8], 
#  [ 1, 9], 
#  [ 2, 10], 
#  [ 3, 11], 
#  [ 4, 12], 
#  [ 5, 13], 
#  [ 6, 14], 
#  [ 7, 15]]) 

然後你可以將文件保存爲:

np.savetxt("*.txt", np.stack([a, b], axis=-1).reshape(-1, 2), fmt="%d") 
+0

哇,我肯定會用Google搜索該一,謝謝你的完整例子! – Henry

+0

不客氣。希望這可以幫助! – Psidom

+1

@亨利你幾乎*從不*應該用'numpy'來寫循環。至少,它承認失敗! –

-1

不知道你在這三個數組中有什麼樣的數據,但是理解你的問題有點困難,但看起來numpy.savetxt對你來說可能是有用的。

下面是它如何工作的:

import numpy as np 
a = np.array(range(10)) 
np.savetxt("myfile.txt", a) 

而這裏的文檔: https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html

+0

但savetxt需要一個二維數組 – hpaulj

1

你可以使用扁平()和dstack(),見下面的例子

a = np.random.random([5,5,5]).flatten() 
b = np.random.random([5,5,5]).flatten() 
c = np.dstack((a,b)) 
print c 

將導致

[[[ 0.31314428 0.35367513] 
    [ 0.9126653 0.40616986] 
    [ 0.42339608 0.57728441] 
    [ 0.50773896 0.15861347] 
.... 
+0

簡單的'np.stack(...,axis = -1)'工作嗎? –

+0

@AustinHastings,那也可以。 – plasmon360

相關問題