1

我见过的大多数 csv 文件都存储这样的数组:

#x y
0 10
1 11
2 12
 .
 .
 .

那么,为什么scipy.savetxt('scipy.txt', (x, y), header='x y', fmt='%g')x, y这样存储:

# x y
0 1 2 3 4 5
10 11 12 13 14 15

虽然scipy.savetxt('y.txt', y, header='y', fmt='%g')会给出:

# y
10
11
12
13
14
15

?

我必须使用scipy.savetxt('common.txt', scipy.column_stack((x,y)), header='x y', fmt='%g')来获得更“常见”的格式。

请注意,要从“通用”文件中读取x和读取:y

x, y = scipy.genfromtxt('common.txt', unpack=True)

xy = scipy.genfromtxt('common.txt')
x = xy[:,0]
y = xy[:,1]

xy = scipy.genfromtxt('common.txt', names=True)
x = xy['x']
y = xy['y']

甚至:

xy = scipy.genfromtxt('common.txt', names=True)
x, y = zip(*xy)
x, y = scipy.array(x), scipy.array(y)

从“scipy”文件:

x, y = scipy.genfromtxt('scipy.txt')

尽管:

xy = scipy.genfromtxt('test.txt', names=True)

会报错,所以我们不能使用header(反正这个header有真正的意义吗?)。

4

2 回答 2

2

问题可能是你保存了一个 (2,N),你真的想要一个 (N,2) 数组。

import numpy as np
x = np.arange(10)
y = x + 2
print (x,y).shape
#(2,10)
z = np.array(zip(x,y))
print z.shape
#(10,2)

或者对标题使用结构化数组

z = np.array(zip(x,y),dtype=[('x',int),('y',float)])
print z.shape
#(10,)
np.savetxt('tmp.txt',z)

这给出了你所期望的。

于 2013-03-21T14:36:43.593 回答
2

np.savetxt写入每行一个元素的一维数组。

np.savetxt写入每行一行的二维数组。

这解释了为什么scipy.savetxt('y.txt', y...)给你一长列。此外,numpy/scipy 认为(x, y)是一维元组,而不是二维数组。这就是为什么你得到

0 1 2 3 4 5
10 11 12 13 14 15

用于输出。

因此,要获得所需的输出,请传递一个二维数组。np.column_stack正如您所指出的,使用可能是最简单的方法:

import numpy as np
np.savetxt(filename, np.column_stack((x,y)), fmt='%g')

要将数据读回xy变量,请使用unpack=True参数:

x, y = np.genfromtxt(filename, unpack=True)
于 2013-03-21T14:44:26.700 回答