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

Convert genfromtxt array to regular numpy array

我无法 post 正在导入的数据,因为它太多了。但是,它同时具有数字和字符串字段,并且有 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 是大小为 (5543,137) 的对象类型,起初看起来很有希望。但是,因为它是 Object 类型,所以还有其他功能无法在其上执行。这个Object数组可以转换成普通的numpy数组吗?

编辑: ndtypes 看起来像... [int,int,...,int,'|U50',int,...,int,'|U50',int,...,int] 即135个数字字段,中间某处有两个字符串类型的字段。

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

npArray2.dtype 是什么样子,或者说 ndtypes 是什么,因为 dtype 是根据您提供的类型和名称构建的。 "void7520" 是一种标识此数组记录的方法,但除了大小(以字节为单位?)之外告诉我们的很少。

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

(编辑 - it has both number and string fields - 你不能将它转换为二维数字数组;它可以是一个字符串数组,但你不能对字符串进行数字数学运算。)

但是如果 dtypes 是混合的,那么你就不能转换它。二维数组的所有元素都具有相同的数据类型。如果您想要混合类型,则必须使用结构化数组方法。 (还有 dtype=object,但我们不要去那里)。

实际上 pandas 正在走 object 路线。显然,它认为从这些数据创建数组的唯一方法是让每个元素成为它自己的类型。并且对象数组的数学运算受到严重限制。它们实际上是一个美化或贬低的列表。