gpt4 book ai didi

python - 以编程方式将列名添加到 numpy ndarray

转载 作者:太空狗 更新时间:2023-10-29 17:28:54 27 4
gpt4 key购买 nike

我正在尝试将列名添加到 numpy ndarray,然后按名称选择列。但它不起作用。我无法确定问题是在我添加名称时出现,还是在稍后尝试调用它们时出现。

这是我的代码。

data = np.genfromtxt(csv_file, delimiter=',', dtype=np.float, skip_header=1)

#Add headers
csv_names = [ s.strip('"') for s in file(csv_file,'r').readline().strip().split(',')]
data = data.astype(np.dtype( [(n, 'float64') for n in csv_names] ))

基于维度的诊断符合我的预期:

print len(csv_names)
>> 108
print data.shape
>> (1652, 108)

“print data.dtype.names”也返回预期的输出。

但是当我开始按字段名称调用列时,就会发生一些奇怪的事情。 “列”仍然是一个有 108 列的数组...

print data["EDUC"].shape
>> (1652, 108)

... 它包含的缺失值似乎比数据集中的行数还多。

print np.sum(np.isnan(data["EDUC"]))
>> 27976

知道这里出了什么问题吗?添加 header 应该是一个微不足道的操作,但我已经与这个错误作斗争了几个小时。帮助!

最佳答案

问题是您在考虑类似电子表格的数组,而 NumPy 确实使用不同的概念。

以下是您必须了解的有关 NumPy 的信息:

  1. NumPy 数组只包含单一类型的元素。
  2. 如果您需要类似电子表格的“列”,这种类型必须是某种类似元组的类型。此类数组称为结构化数组,因为它们的元素是结构(即元组)。

在您的情况下,NumPy 会采用您的二维常规数组并生成一个一维 类型为 108 元素元组的数组(您考虑的电子表格数组是 2 -维度)。

做出这些选择可能是出于效率原因:数组的所有元素都具有相同的类型,因此具有相同的大小:可以在低级别非常简单快速地访问它们。

现在,正如 user545424 所示,NumPy 对您想要做的事情有一个简单的答案(genfromtxt() 接受带有列名称的 names 参数)。

如果您想将数组从常规 NumPy ndarray 转换为结构化数组,您可以执行以下操作:

data.view(dtype=[(n, 'float64') for n in csv_names]).reshape(len(data))

(你很接近:你使用了 astype() 而不是 view())。

您还可以查看许多 Stackoverflow 问题的答案,包括 Converting a 2D numpy array to a structured arrayhow to convert regular numpy array to record array? .

关于python - 以编程方式将列名添加到 numpy ndarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10742406/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com