在python / numpy中使用genfromtxt()函数时出错

时间:2015-09-11 00:42:35

标签: python arrays numpy

我是python的新手,我试图使用genfromtext()函数 我正在从csv文件中读取数据,将其转换为numpy中的数组并从我想要使用的数组中读取特定列。该阵列有一排我不需要的标题。数组中的一列是一串字符,其余是整数。我想isloate字符串和一列整数。这是我到目前为止所尝试的内容。

import csv 
import os 
import numpy as np 
import matplotlib.pyplot as plt 

csv_to_array2 = np.genfromtxt('test.csv',    
delimiter = ',' , dtype = "S5, S5, S5, S5, S5, S5" ) 

numrows2 = len(csv_to_array2)
numcols2 = len((csv_to_array2).T)
print(numrows2)
print(numcols2) 


head_and_data2 = np.vsplit(csv_to_array2, np.array([1]) ) 

data2 = head_and_data2[1]
data_split2 = np.hsplit(data2, np.array([1,2]))
print(data2)

col_title= data_split2[0]
y = data_split2[1]
print(col_title) 

我的测试文件如下

  ,n1,n2,n3,n4,n5
  p1,1,2,3,4,5
  p2,6,7,8,9,10
  p3,11,12,13,14,15
  p4,16,18,18,19,20
  p5,21,22,23,24,25 

当我运行程序时,输出如下

[(b'', b'n1', b'n2', b'n3', b'n4', b'n5')
 (b'p1', b'1', b'2', b'3', b'4', b'5')
 (b'p2', b'6', b'7', b'8', b'9', b'10')
 (b'p3', b'11', b'12', b'13', b'14', b'15')
 (b'p4', b'16', b'18', b'18', b'19', b'20')
 (b'p5', b'21', b'22', b'23', b'24', b'25')]

追踪(最近一次呼叫最后一次):

  File "/home/shubha/workspace/Raj_Data/Test_part.py", line 24, in <module>
    head_and_data2 = np.vsplit(csv_to_array2, np.array([1]) ) 
  File "/usr/lib/python3/dist-packages/numpy/lib/shape_base.py", line 590, in vsplit
    raise ValueError('vsplit only works on arrays of 2 or more dimensions')
ValueError: vsplit only works on arrays of 2 or more dimensions

当我更改dtype= None时,我会获得正确的列,但使用&#39; b&#39;在每个条目之前附加。因此,对于第二列第一行(在删除标题之后),我得到b&#39; 1&#39;当我删除dtype时,它给我一个错误,它无法读取第一列,每个条目都是&#39; nan&#39;

我很感激你能给我的任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

genfromtxt的输出感到困惑时,要做的第一件事就是打印数组的shapedtype

b'1'是显示字节字符串的Python3方式。像这样的文件被读作字节。

我可以使用字节文本文件模拟您的数据文件。我在Python3中工作,其中字符串是unicode。字节字符串标有b。我还添加了一个n0

In [78]: txt=b""" n0,n1,n2,n3,n4,n5
  p1,1,2,3,4,5
  p2,6,7,8,9,10
  p3,11,12,13,14,15
  p4,16,18,18,19,20
  p5,21,22,23,24,25 
"""

加载genfromtxt; names=True1st行获取字段名称; dtype=None让它确定最佳字段类型:

In [79]: arr=np.genfromtxt(txt.splitlines(), names=True, delimiter=',', dtype=None)
In [80]: arr
Out[80]: 
array([(b'p1', 1, 2, 3, 4, 5), (b'p2', 6, 7, 8, 9, 10),
       (b'p3', 11, 12, 13, 14, 15), (b'p4', 16, 18, 18, 19, 20),
       (b'p5', 21, 22, 23, 24, 25)], 
      dtype=[('n0', 'S2'), ('n1', '<i4'), ('n2', '<i4'), ('n3', '<i4'), ('n4', '<i4'), ('n5', '<i4')])

结果是一个5元素数组,有6个字段:

In [81]: arr.shape
Out[81]: (5,)
In [82]: arr.dtype
Out[82]: dtype([('n0', 'S2'), ('n1', '<i4'), ('n2', '<i4'), ('n3', '<i4'), ('n4', '<i4'), ('n5', '<i4')])

n0字段是5个字节的字符串:

In [83]: arr['n0']
Out[83]: 
array([b'p1', b'p2', b'p3', b'p4', b'p5'], 
      dtype='|S2')

“n2”字段是5个整数(“n1”等相同)

In [84]: arr['n2']
Out[84]: array([ 2,  7, 12, 18, 22])
In [85]: 

不需要垂直或水平分割。

我可以使用astype将第一个字段转换为unicode。

In [86]: arr['n0'].astype('U2')
Out[86]: 
array(['p1', 'p2', 'p3', 'p4', 'p5'], 
      dtype='<U2')

列(字段)名称可以在dtype

中找到
In [87]: arr.dtype.names
Out[87]: ('n0', 'n1', 'n2', 'n3', 'n4', 'n5')

我也可以在原来的dtype

中进行unicode转换
In [90]: dt='U2,i,i,i,i,i'
In [91]: arr=np.genfromtxt(txt.splitlines(), names=True, delimiter=',' ,dtype=dt)In [92]: arr
Out[92]: 
array([('p1', 1, 2, 3, 4, 5), ('p2', 6, 7, 8, 9, 10),
       ('p3', 11, 12, 13, 14, 15), ('p4', 16, 18, 18, 19, 20),
       ('p5', 21, 22, 23, 24, 25)], 
      dtype=[('n0', '<U2'), ('n1', '<i4'), ('n2', '<i4'), ('n3', '<i4'), ('n4', '<i4'), ('n5', '<i4')])
In [93]: arr['n0']
Out[93]: 
array(['p1', 'p2', 'p3', 'p4', 'p5'], 
      dtype='<U2')