当数据文件只有一行时,numpy genfromtxt如何合并recarray

3 投票
2 回答
1906 浏览
提问于 2025-04-18 09:57

我正在使用genfromtxt函数从一个csv文件中读取数据。

data = np.genfromtxt(file_name, dtype=np.dtype(input_vars), delimiter=",")

然后我可以通过例如以下方式访问数组的列:

data["My column name"]

这会返回一个一维的向量。只有当源文件恰好有一行数据时,数组才会被压缩——它的shape==(),因此通过data["我的列名"]返回的不是一个向量,而只是一个值,这样后面的某些函数就会出错,因为它们期待的是一个向量。

我需要的是让它始终保持为一个向量。换句话说,我希望genfromtxt在数据文件只有一行时也不要压缩数组的维度。

换句话说,如果源数据文件有两行,data.shape==(2,)。但如果源数据文件只有一行,data.shape==(),而我希望它是(1,)。这样,如果我没记错的话,data["我的列名"]就会返回一个向量(虽然只有一个元素),后面的函数就不会出错了。

我该怎么做呢?data.reshape((1,))np.atleast_1d(data)对我来说都不管用,不知道为什么...

更新:

我做了一个简单的例子来说明我的问题。

假设我有两个文件:

mydata1.csv,里面只有一行:

1,2,3

还有mydata2.csv,里面有两行:

1,2,3
4,5,6

这是代码片段(问题在评论中描述):

import numpy as np
dt = [("A", "<i4"), ("B", "<i4"), ("C", "<i4")]
data2 = np.genfromtxt("mydata2.csv", dtype=dt, delimiter=",")
print(data2.shape)  # returns (2,)
data1 = np.genfromtxt("mydata1.csv", dtype=dt, delimiter=",")
print(data1.shape)  # returns () but I need it to return (1,)

data2["A"]  # returns a 1D vector with two values
data1["A"]  # returns a value (zero dimensional) bt I need a 1D vector with one value

我能想到的所有解决办法都太复杂,导致代码重构太多。理想情况下,我希望genfromtxt的结果始终是一个一维的记录数组。

2 个回答

0

你可以试试用 loadtxt 代替 genfromtxt,并加上一个参数 ndmin=1。不过,如果你需要 genfromtxt 的一些高级功能,那就不能这样做了。

2

当你的 csv 文件里只有一行数据时,你得到的 data 会是一个 np.void 对象。你可以强制把 data 转换成 np.ndarray,方法是:

data = np.atleast_1d(data)

撰写回答