genfromtxt生成元组,recfromcsv也是如此

时间:2014-06-26 11:53:17

标签: python arrays csv numpy

我有一个以下结构的csv文件(以逗号分隔):

A1,A2,A3

16516.1556163,163163.48315,41816.844334

当我尝试使用numpy创建一个2d矩阵时,它总是被转换成类似结构化数组的东西。 根据我使用的csv文件的给定结构:

y = np.genfromtxt('file.csv', delimiter=',', usecols=(0,2), names=True)

y = np.recfromcsv('file.csv', usecols=(0,2)

在这两种情况下,我的数组的形状为(1,)而不是(1,2)。查看genfromtxt或recfromcsv生成的dtypes,我可以看出它们都是相同的dtype(' a1','< f8')。

你能告诉我如何从csv中读取正确格式的数组吗?

干杯托马斯

3 个答案:

答案 0 :(得分:1)

当我尝试重现您的代码时,我得到:

In [71]: c = StringIO("A1,A2,A3\n16516.1556163,163163.48315,41816.844334")

In [72]: x = np.genfromtxt(c,delimiter=',',usecols=(0,2),names=True)
Out[72]: 
array((16516.1556163, 41816.844334), 
      dtype=[('A1', '<f8'), ('A3', '<f8')])

In [73]: x.shape
Out[73]: ()

In [83]: x.item()
Out[83]: (16516.1556163, 41816.844334)

In [129]: x.reshape((1,))
Out[129]: 
array([(16516.1556163, 41816.844334)], 
      dtype=[('A1', '<f8'), ('A3', '<f8')])

所以x是一个记录数组。只有一个数据行,它的形状为()(&#39;标量&#39;)。如果您给它两个数据行,则形状为(2,)。如果&#39; names = False&#39;,并且您告诉它跳过第1行,则结果(包含2行)将为(2,2)

这些&#39; ... fromtxt&#39;函数,逐行读取文件,解析每一行并构建列表列表,例如: [[1,2,3],[3,4,5]]。然后转到np.array(使用适当的dtype)。最后得到一个.squeeze(),删除所有单例维度。

最后squeeze将形状为(1,)的数组转换为()(或(1,2)->(2,))。您可以使用reshape轻松添加该维度。

要创建包含2列的矩阵,您需要跳过标题和名称:

In [121]: x=np.genfromtxt(c,delimiter=',',usecols=(0,2),skip_header=1)

In [122]: x
Out[122]: array([ 16516.1556163,  41816.844334 ])

In [123]: x.shape
Out[123]: (2,)

答案 1 :(得分:0)

您可以阅读csv文件,其中astropy库可以读取表格。以下是一个示例实现:

>>> from astropy.io import ascii
>>> from numpy import *
>>> data = ascii.read("test.csv",format='csv',delimiter=',')
>>> print data
      A1           A2           A3     
------------- ------------ ------------
16516.1556163 163163.48315 41816.844334

然后使用numpy将其转换为包含三列的数组。顺便说一下,你不能有一个字符串数组和浮点数。

>>> a = hstack((data['A1'],data['A2'],data['A3']))
>>> print a
[  16516.1556163  163163.48315     41816.844334 ]

答案 2 :(得分:0)

我在这两个建议上坐了一段时间,因为基本上我从第一个建议尝试了所有东西,我已经去了天文。我在文档中读到csv作为一种格式支持,但是,嘿,这对于版本0.3来说从来没有用过。版本0.3.2支持的格式不包括csv和PyPi,这是最新版本。

但是,我尝试了format='fixed_width'并且读了一些内容,但这些价值几乎被误解了。

我仍然无法得到它,但是当我忽略第一行skip_header=1并完全牺牲列名时,不设置names(默认为None )然后它起作用。

现在,当我说:

x = np.genfromtxt('file.csv', delimiter=',', skip_header=1)
x.shape

结果为(10615, 52)