在python

时间:2017-03-31 21:42:32

标签: python numpy

我有两个3d numpy数组,称它们为a和b,512x512x512。我需要将它们写入文本文件:

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专业人员上更喜欢几秒钟时)。

我正在使用python 3.6,最新的numpy,我很乐意使用其他库,构建扩展,无论什么是必要的。提高速度的最佳方法是什么?

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

你可以使用flatten()和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]
....

答案 2 :(得分:-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