pythonnumpy:用正确的值typ将csv读入numpy

2024-09-28 20:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的测试_数据.csv公司名称:

A,1,2,3,4,5
B,6,7,8,9,10
C,11,12,13,14,15
A,16,17,18,19,20

我用下面的代码把它读给numpy数组:

^{pr2}$

在主代码中,我有:

    numpyArray = readCSVToNumpyArray('test_data.csv')
    print(numpyArray)

结果是:

(array([['A', '1', '2', '3', '4', '5'],
       ['B', '6', '7', '8', '9', '10'],
       ['C', '11', '12', '13', '14', '15'],
       ['A', '16', '17', '18', '19', '20']], 
      dtype='|S2'))

但是数组中的所有数字都被视为string,有没有一种好方法可以让它们存储为float,而不必遍历每个元素并指定类型?在

谢谢!在


Tags: csv数据代码testnumpy名称data公司
3条回答

我在使用Pandas中读过它,它让您可以很容易地设置每列的数据类型。在

import numpy as np 
import pandas as pd 

pdDF = pd.read_csv(
    'test_data.csv', 
    header=None, 
    names=list('abcdef'), 
    dtype=dict(zip(list('abcdef'),[str]+[float]*5)))

现在每个列都将具有适当的数据类型。在

^{pr2}$

如果您还想在numpy数组中使用它,您可以只获取值。在

npArr = pdDF.values

npArr
Out[27]: 
array([['A', 1.0, 2.0, 3.0, 4.0, 5.0],
       ['B', 6.0, 7.0, 8.0, 9.0, 10.0],
       ['C', 11.0, 12.0, 13.0, 14.0, 15.0],
       ['A', 16.0, 17.0, 18.0, 19.0, 20.0]], dtype=object)

它仍然是'row'数组的对象,因为您不能将'A'变成float,但是各个值将根据需要成为float。在

type(npArr[0,1])
Out[28]: float

最后,如果你只想要一个浮点数数组,那也很容易。。。只需将第一列以外的所有列作为数组输出,它将具有dtype:float而不是object。在

pdDF.loc[:,pdDF.columns>='b'].values
Out[28]: 
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.],
       [ 11.,  12.,  13.,  14.,  15.],
       [ 16.,  17.,  18.,  19.,  20.]])

pdDF.loc[:,pdDF.columns>='b'].values.dtype
Out[29]: dtype('float64')

np.genfromtxt可以轻松地将数据加载到结构化数组中。它将是一个1d数组,每个列都有一个字段:

使用行列表模拟文件:

   In [265]: txt=b"""A,1,2,3,4,5
       .....: B,6,7,8,9,10
       .....: C,11,12,13,14,15
       .....: A,16,17,18,19,20"""
    In [266]: txt=txt.splitlines()
    In [267]: A=np.genfromtxt(txt,delimiter=',',names=None,dtype=None)
    In [268]: A
    Out[268]: 
    array([(b'A', 1, 2, 3, 4, 5), (b'B', 6, 7, 8, 9, 10),
           (b'C', 11, 12, 13, 14, 15), (b'A', 16, 17, 18, 19, 20)], 
          dtype=[('f0', 'S1'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<i4')])

它从列值-strings和int推导出dtype。字段按名称访问

^{pr2}$

我还可以定义一个dtype,将字符串放入一个字段,将所有其他值放入另一个字段。在

In [271]: A=np.genfromtxt(txt,delimiter=',',names=None,dtype='S2,(5)int')
In [272]: A
Out[272]: 
array([(b'A', [1, 2, 3, 4, 5]), (b'B', [6, 7, 8, 9, 10]),
       (b'C', [11, 12, 13, 14, 15]), (b'A', [16, 17, 18, 19, 20])], 
      dtype=[('f0', 'S2'), ('f1', '<i4', (5,))])
In [273]: A['f1']
Out[273]: 
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20]])

因为每行的第一个字符是一个字符串,所以在numpy中必须使用一个更灵活的类型,称为“object”。尝试使用此函数,看看这是否是您要查找的:

    def readCSVToNumpyArray(dataset):
        values = [[]]
        with open(dataset) as f:
            counter = 0
            for i in csv.reader(f):
                for j in i:
                    try:
                        values[counter].append(float(j))
                    except ValueError:
                        values[counter].append(j)
                counter = counter + 1
                values.append([])

        data = numpy.array(values[:-1],dtype='object')

        return data

    numpyArray = readCSVToNumpyArray('test_data.csv')
    print(numpyArray)

结果是:

^{pr2}$

相关问题 更多 >