将 .csv 文件转换为 Numpy 数组

6

我想将mydata.csv文件转换为Numpy数组。

我有一个矩阵表示的mydata.csv文件(该矩阵是14*79的,带符号值且没有任何标题名称)。

-0.094391   -0.086641   0.31659 0.66066 -0.33076    0.02751 
-0.26169    -0.022418   0.47564 0.39925 -0.22232    0.16129 
-0.33073    0.026102    0.62409 -0.098799   -0.086641   0.31832 
-0.22134    0.15488 0.69289 -0.26515    -0.021011   0.47096 

我以为这段代码可以在这种情况下正常工作。

import numpy as np

data = np.genfromtxt('mydata.csv', dtype=float, delimiter=',', names=False) 

但是它没有起作用。

我希望最终的Numpy数据形状为 data.shape = (14, 79)

然而,我的错误消息看起来像这样..

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-060012d7c568> in <module>
      1 import numpy as np
      2 
----> 3 data = np.genfromtxt('output.csv', dtype=float, delimiter=',', names=False)

~\Anaconda3\envs\tensorflow\lib\site-packages\numpy\lib\npyio.py in genfromtxt(fname, dtype, comments, delimiter, skip_header, skip_footer, converters, missing_values, filling_values, usecols, names, excludelist, deletechars, replace_space, autostrip, case_sensitive, defaultfmt, unpack, usemask, loose, invalid_raise, max_rows, encoding)
   1810                            deletechars=deletechars,
   1811                            case_sensitive=case_sensitive,
-> 1812                            replace_space=replace_space)
   1813     # Make sure the names is a list (for 2.5)
   1814     if names is not None:

~\Anaconda3\envs\tensorflow\lib\site-packages\numpy\lib\_iotools.py in easy_dtype(ndtype, names, defaultfmt, **validationargs)
    934             # Simple dtype: repeat to match the nb of names
    935             if nbtypes == 0:
--> 936                 formats = tuple([ndtype.type] * len(names))
    937                 names = validate(names, defaultfmt=defaultfmt)
    938                 ndtype = np.dtype(list(zip(names, formats)))

TypeError: object of type 'bool' has no len()

6
在样本数据中,分隔符不是逗号(可能是制表符),而“names”应该是“None”或其他内容,但不能是“False”。 - Michael Butscher
@MichaelButscher import numpy as np data = np.genfromtxt('mydata.csv', dtype=float, delimiter='\t', names=None) 但是现在的 data[nan nan nan nan nan nan nan nan nan nan nan nan nan nan] - mario119
显然,您已经尝试过 delimiter=','delimiter='\t'。您能否找出文件中实际的分隔符而不是猜测?该文件是如何创建的?您能否在编辑器中打开文件并检查分隔字段的字符? - Warren Weckesser
@WarrenWeckesser 我会在这里分享 mydata.csv 文件 https://pastebin.com/eKf9Sqip - mario119
np.loadtxt('mydata.csv', delimiter='\t')np.genfromtxt('mydata.csv', delimiter='\t') 两种方式都能正常工作。 - Warren Weckesser
3个回答

3

首先,您需要创建一个包含要追加的CSV文件名的列表(file_names)。然后,通过重新塑造Numpy-Array,您可以将其导出为单个CSV文件。这将帮助您继续前进:

import pandas as pd
import numpy as np

combined_csv_files = pd.concat( [ pd.read_csv(f) for f in file_names ])

现在,如果你想将这些文件导出为单个 .csv 文件,请使用以下方法:

导出 这些文件,使用如下方式:

combined_csv_files.to_csv( "combined_csv.csv", index=False)

现在,为了获得Numpy数组,您可以像这样继续进行:

data_set = pd.read_csv('combined_csv.csv', header=None)
data_frames = pd.DataFrame(data_set)

required_array = np.array(data_frames.values)
print(required_array)

在这里,您还可以使用以下方法来重新调整Numpy数组:

required_array.shape = (100, 14, 79)

我已经在 命令提示符 上进行了简单测试以确认这一点:
>>> y = np.zeros((2, 3, 4))
>>> y.shape
(2, 3, 4)
>>> y.shape = (3, 8)
>>> y
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])

成功了!但我有另一个问题。如果我想要合并很多数据集(比如说我有mydata_1.csv、mydata_2.csv、mydata_3.csv、mydata_100.csv),怎么才能自动地将它们合并成一个形状为(100, 14, 79)的numpy数组呢? 因为我需要使用自己的数据来运行卷积神经网络代码,这个代码是用于MNIST数据集的。 - mario119
@mario119:不要在评论中添加您的要求,而应将它们添加到问题中。现在所选答案涵盖了问题范围之外的主题,实际问题已经被推到了后台。对于通过搜索引擎访问此页面的人来说,这并不有帮助。 - mins

2

试试这个:

import pandas as pd
import numpy as np
mydata = pd.read_csv("mydata.csv")
mydata_array = np.array(mydata)

Out:
array([[-0.26169 , -0.022418,  0.47564 ,  0.39925 , -0.22232 ,  0.16129 ],
   [-0.33073 ,  0.026102,  0.62409 , -0.098799, -0.086641,  0.31832 ],
   [-0.22134 ,  0.15488 ,  0.69289 , -0.26515 , -0.021011,  0.47096 ]])

成功了!我认为输出是numpy数组。但是,array([.., .., ..], ...])[[... ... ...] [... ... ...]...]之间有什么区别呢? - mario119

2
In [347]: txt = """-0.094391   -0.086641   0.31659 0.66066 -0.33076    0.02751 
     ...: -0.26169    -0.022418   0.47564 0.39925 -0.22232    0.16129 
     ...: -0.33073    0.026102    0.62409 -0.098799   -0.086641   0.31832 
     ...: -0.22134    0.15488 0.69289 -0.26515    -0.021011   0.47096""".splitli
     ...: nes()                                                                 
In [348]: txt                                                                   
Out[348]: 
['-0.094391   -0.086641   0.31659 0.66066 -0.33076    0.02751',
 '-0.26169    -0.022418   0.47564 0.39925 -0.22232    0.16129',
 '-0.33073    0.026102    0.62409 -0.098799   -0.086641   0.31832',
 '-0.22134    0.15488 0.69289 -0.26515    -0.021011   0.47096']

In [349]: np.genfromtxt(txt)                                                    
Out[349]: 
array([[-0.094391, -0.086641,  0.31659 ,  0.66066 , -0.33076 ,  0.02751 ],
       [-0.26169 , -0.022418,  0.47564 ,  0.39925 , -0.22232 ,  0.16129 ],
       [-0.33073 ,  0.026102,  0.62409 , -0.098799, -0.086641,  0.31832 ],
       [-0.22134 ,  0.15488 ,  0.69289 , -0.26515 , -0.021011,  0.47096 ]])

Falsenames的一个不好的值:

In [350]: np.genfromtxt(txt, names=False)                                       
---------------------------------------------------------------------------
...
TypeError: object of type 'bool' has no len()

names=None可以,但那是默认值,所以不需要。

看起来分隔符是空格。我没有看到任何逗号。默认的数据类型是浮点型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接