将几个numpy数组保存到一个csv

时间:2016-03-01 13:12:36

标签: python csv numpy

我有几个不同的专栏'我需要保存为CSV。目前我这样做:

f = open(out_csv, 'w', newline='') 
w = csv.writer(f, delimiter=",", )
w.writerow(['id_a', 'id_b',
            'lat_a','lon_a',
            'lat_b','lon_b',
            'proj_metres'])
w.writerows(np.column_stack((
            id_labels[udist.row],
            id_labels[udist.col],
            points[udist.row],
            points[udist.col],
            udist.data)))

也许并不重要,但为了完整性:

tree_dist = tree.sparse_distance_matrix(tree)
udist = sparse.tril(tree_dist, k=-1)

维度大约有3千万列7列(其中两列是字符串:id_labels) - 所以这需要一段时间(大约8分钟)并使用大量的RAM,因为我认为python在我调用时会创建一个新的临时对象np.column_stack所以在一个时间点它保持所需数据的两倍。

我希望有更好的方法来创建我需要的CSV吗?

3 个答案:

答案 0 :(得分:1)

您可以使用追加选项打开文件,然后使用np.savetxt

import numpy as np
array1 = np.arange(12).reshape((2, 6))
array2 = np.ones(18).reshape((3, 6))
with open('outputfile.csv', 'ab') as f:
    np.savetxt(f, array1, delimiter=',')
    np.savetxt(f, array2, delimiter=',')

答案 1 :(得分:1)

首先,逐个保存文件以避免内存问题。

让我们考虑3个解决方案:

a=np.rand(10000,7)

import csv
def testfile():
    with open('test.csv','w') as f :
        w=csv.writer(f)
        w.writerows(a)

def testsavetxt():
    np.savetxt('test.csv',a)


def testpickle():
    with open('test.pickle','wb') as f:
        pickle.dump(a,f)    

一些测试:

In [43]: %timeit testfile()
1 loops, best of 3: 576 ms per loop

In [44]: %timeit testsavetxt()
1 loops, best of 3: 442 ms per loop

In [45]: %timeit testpickle()
100 loops, best of 3: 12.3 ms per loop

所以savetext的速度要快一些。

如果csv不是必需的,pickle提供二进制协议,速度提高40倍。

答案 2 :(得分:0)

不一定快,但是:

import numpy as np
arr1 = np.array([1,2,3,4])
arr2 = np.array([11,12,13,14])
arr3 = np.array([21,22,23,24])
numpy_arrays = [arr1, arr2, arr3]

with open(out_csv, "w") as f:
    for values in zip(*numpy_arrays): # or just zip(arr1, arr2, arr3)
        for value in values:
            f.write(str(value) + ",")
        f.write("\n")

这不会消耗更多的内存,而不仅仅是单独数组所需的内存。