当数据文件只有一行时,numpy genfromtxt如何合并recarray
我正在使用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)