我有一个以下结构的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中读取正确格式的数组吗?
干杯托马斯
答案 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)