我发现有很多方法可以在 Python 中输入带有文本条目的 csv 文件作为数值数组,例如 this和 this ,但没有一个是我遇到的情况,也没有一个对我有用。我也在 the manual 中找不到答案用于执行此操作的 numpy 或其他常用工具,但也许它就在那里,我只是无法理解。
我在这样的 csv 中有数据:
"experiment 1"
"var1","var2","var3","var4","var5"
"7","0","1","3","1"
"8","4","3","1","1"
"8","5","3","3","1"
"8","6","3","3","3"
我尝试使用
读取数据dataArray = np.genfromtxt('Input Data/'+fileName,delimiter=',',skiprows=2)
我也尝试添加
.astype(np.float)
到最后。但是在这两种情况下我最终得到的是:
[[ nan nan nan nan nan]
[ nan nan nan nan nan]
[ nan nan nan nan nan]
[ nan nan nan nan nan]]
因为根据文档,genfromtxt 应该将数字列中的字符串转换为 nan。 genfromtxt
也有一个 converters
参数,但我能找到的唯一使用它的例子来自文档:
converters = {3: lambda s: float(s or 0)}
而且我真的无法理解该语法。假设内置转换器可以处理我的数据,那么为此编写转换器参数的正确语法是什么?如果转换器不能满足我的需要,有人知道如何读入这些数据吗?我原以为这会非常简单,我会在 5 分钟内找到,但我现在已经在这上面浪费了几个小时。
最佳答案
经过更多的搜索、尝试和斗争,我设法找到了一种方法来做到这一点。
首先,为了方便起见,我单独制作了一个转换公式,并在 genfromtxt
命令中调用它:
convert = lambda x: float(x.strip('"') or -999)
这是什么lambda function所做的是从每个条目中去除双引号字符(或者如果它是空的或 nan
将其设置为 -999
),然后将条目转换为 float 。然后它像这样进入 genfromtext
命令:
dataArray = np.genfromtxt('Input Data/'+fileName,delimiter=',',skip_header=2,converters={0: convert,1: convert,2: convert,3: convert,4: convert},dtype=None)
这适用于这种特殊情况,但它有两个问题:(1) 您必须分别为每一列指定转换器——我找不到指定“应用于所有列”的方法。 执行此操作的更好方法是使用遍历所有列并将转换应用于所有列的迭代函数...然后该函数将指定将其应用到哪些列。如果可能的话,我不知道该怎么做。问题 (2) 是您无法结合转换器读取 header 。 例如:
dataArray = np.genfromtxt('Input Data/'+fileName,delimiter=',',skip_header=1,names=True,converters={0: convert,1: convert,2: convert,3: convert,4: convert},dtype=None)
如果数据上方的行有列标题,应该可以工作,但是当从列中读入名称时,它不再是一个数组,而是一个元组列表。这可能是因为数据中的列名也有引号,并且转换器未应用于它们。这应该无关紧要,因为它们不是数组的一部分,数组全是数字,但这似乎是 genfromtxt
的工作方式。也就是说,它似乎不是执行此任务的非常好/可靠的方法,当然它的文档也很少,因此不清楚它能做什么或不能做什么以及如何获得方法来做这些事情.
对于将来遇到此问题的人,我的建议是寻找其他方法来执行此功能。许多人在其他问题中推荐了 pandas
来完成类似的任务,但我不知道它是否更适合这种情况。现在这对我有用,但在不久的将来,它必须被更强大的 csv 阅读器取代,以生成 numpy 可以轻松构建到数组中的文件格式。
关于python - 如何为 numpy genfromtxt 设置字符串到浮点转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33232961/