【发布时间】:2020-11-04 14:15:23
【问题描述】:
我了解使用genfromtxt,defaultfmt 参数可用于推断默认列名,如果列名不在输入数据中,这很有用。而defaultfmt,如果未提供,则默认为f%i。例如
>>> data = StringIO("1 2 3\n 4 5 6")
>>> np.genfromtxt(data, dtype=(int, float, int))
array([(1, 2.0, 3), (4, 5.0, 6)],
dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<i8')])
所以这里我们有自动生成的列名f0、f1、f2。
但是如果我想让 numpy 推断 both 列标题和数据类型怎么办?我以为你用dtype=None 来做。像这样
>>> data3 = StringIO("1 2 3\n 4 5 6")
>>> np.genfromtxt(data3, dtype=None, ???) # some parameter combo
array([(1, 2, 3), (4, 5, 6)],
dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8')])
我仍然想要f0、f1...等自动生成的列名。我希望 numpy 能够根据数据自动确定数据类型,我认为这就是 dtype=None 的全部意义所在。
编辑 但不幸的是,这并不总是有效。
当我同时有浮点数和整数时,这种情况有效。
>>> data3b = StringIO("1 2 3.0\n 4 5 6.0")
>>> np.genfromtxt(data3b, dtype=None)
array([(1, 2, 3.), (4, 5, 6.)],
dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<f8')])
所以 numpy 正确推断前 2 列的数据类型为 i8,最后一列为 f8。
但是,如果我提供所有整数,推断的列名称就会消失。
>>> data3c = StringIO("1 2 3\n 4 5 6")
>>> np.genfromtxt(data3c, dtype=None)
array([[1, 2, 3],
[4, 5, 6]])
根据输入数据,我的相同代码可能有效,也可能无效?这听起来不对。
是的,我知道有熊猫。但我不是故意使用熊猫。所以请多多包涵。
【问题讨论】:
-
看起来值都是整数,因此默认操作是返回常规二维数组而不是结构化数组。
-
dtype 不必有名称。例如。
dtype='i,f,i'或['i','f','i'] -
谢谢。您是在谈论传入的 dtype 吗?问题是,我不想为 dtype 传递任何东西。至于所有整数与整数/浮点数的混合 - 如果它是混合的,似乎 numpy 会做我想要的,但如果是所有整数则不是。
标签: python numpy genfromtxt