我有几个不同的专栏'我需要保存为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吗?
答案 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")
这不会消耗更多的内存,而不仅仅是单独数组所需的内存。