将genfromtxt数组转换为常规numpy数组

时间:2016-11-04 19:26:28

标签: python arrays pandas numpy genfromtxt

我无法发布导入的数据,因为它太多了。但是,它有数字和字符串字段,是5543行和137列。我使用此代码导入数据(ndnames和ndtypes包含列名和列数据类型):

npArray2 = np.genfromtxt(fileName, 
                        delimiter="|", 
                        skip_header=1, 
                        dtype=(ndtypes), 
                        names=ndnames, 
                        usecols=np.arange(0,137)
                        )

这是有效的,结果变量类型是“void7520”,大小(5543,)。但这实际上是5543行的一维数组,其中每个元素都包含一个包含137个元素的子数组。我想将其转换为5543行和137列的正常numpy数组。怎么办呢?

我尝试了以下(使用Pandas):

pdArray = pd.read_csv(fileName, 
                      sep=ndelimiter,
                      index_col=False, 
                      skiprows=1,
                      names=ndnames
                      )
npArray = pd.DataFrame.as_matrix(pdArray)

但是,生成的npArray是类型为Object的大小(5543,137),起初看起来很有希望。但是,因为它是Object类型,所以还有其他功能无法在其上执行。这个Object数组可以转换成普通的numpy数组吗?

编辑: ndtypes看起来像...... [INT,INT,...,INT, '| U50',INT,...,INT, '| U50',INT,...,INT] 也就是说,135个数字字段中间有两个字符串类型的字段。

1 个答案:

答案 0 :(得分:0)

npArray2是1d结构化数组,5543个元素和137个字段。

npArray2.dtype看起来像什么,或等同于ndtypes是什么,因为dtype是根据您提供的类型和名称构建的。 " void7520"是一种识别这个数组的记录的方法,但除了大小(以字节为单位)之外几乎没有告诉我们。

如果dtype的所有字段都是数字,那么如果它们都是相同的数字dtype(int,float),那么将它转换为具有137列(第二个暗淡)的二维数组则相当容易。可以使用astypeview

(编辑 - it has both number and string fields - 您无法将其转换为二维数组;它可能是一个字符串数组,但您无法对字符串进行数值计算。)< / p>

但如果dtypes混合,那么你就无法转换它。 2d数组的所有元素都具有相同的dtype。如果需要混合类型,则必须使用结构化数组方法。 (好吧有dtype=object,但是不要去那里)。

实际上pandas正在走object路线。显然它认为从这个数据中生成数组的唯一方法是让每个元素都是它自己的类型。并且对象数组的数学受到严格限制。它们实际上是一个美化或贬低的名单。