得到numpy ndarray的描述性统计数据

bet*_*eta 12 python numpy scipy multidimensional-array

我使用以下代码创建一个numpy-ndarray.该文件有9列.我明确键入每列:

dataset = np.genfromtxt("data.csv", delimiter=",",dtype=('|S1', float, float,float,float,float,float,float,int))
Run Code Online (Sandbox Code Playgroud)

现在我想为每一列(min,max,stdev,mean,median等)获得一些描述性统计数据.难道不应该有一个简单的方法来做到这一点?

我试过这个:

from scipy import stats
stats.describe(dataset)
Run Code Online (Sandbox Code Playgroud)

但是这会返回一个错误: TypeError: cannot perform reduce with flexible type

我的问题是:如何获得创建的numpy-ndarray的描述性统计信息.

小智 23

import pandas as pd
import numpy as np

df_describe = pd.DataFrame(dataset)
df_describe.describe()
Run Code Online (Sandbox Code Playgroud)

请注意,数据集是您要描述的 np.array。

import pandas as pd
import numpy as np

df_describe = pd.DataFrame('your np.array')
df_describe.describe()
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是迄今为止最简单的选择。您甚至不需要创建新变量,只需编写“pd.DataFrame(my_array).describe()”即可。 (6认同)
  • 只有一行,没有 for 循环。这是最好的答案。 (2认同)

M.T*_*M.T 12

这不是一个漂亮的解决方案,但它完成了工作.问题是,通过指定多个dtypes,你实际上是在创建一个元组的一维数组(实际上np.void),这不能用统计数据来描述,因为它包含多个不同的类型,包括.字符串.

这可以通过两轮阅读或使用熊猫来解决read_csv.

如果你决定坚持numpy:

import numpy as np
a = np.genfromtxt('sample.txt', delimiter=",",unpack=True,usecols=range(1,9))
s = np.genfromtxt('sample.txt', delimiter=",",unpack=True,usecols=0,dtype='|S1')

from scipy import stats
for arr in a: #do not need the loop at this point, but looks prettier
    print(stats.describe(arr))
#Output per print:
DescribeResult(nobs=6, minmax=(0.34999999999999998, 0.70999999999999996), mean=0.54500000000000004, variance=0.016599999999999997, skewness=-0.3049304880932534, kurtosis=-0.9943046886340534)
Run Code Online (Sandbox Code Playgroud)

请注意,在此示例中,最终数组具有dtypeas float,not int,但可以轻松(如果需要)使用转换为intarr.astype(int)


hpa*_*ulj 7

如何处理混合数据的问题genfromtxt经常出现。人们期望得到一个二维数组,但却得到一个无法按列索引的一维数组。那是因为他们得到一个结构化数组 - 每列都有不同的数据类型。

文档中的所有示例都genfromtxt表明了这一点:

>>> s = StringIO("1,1.3,abcde")
>>> data = np.genfromtxt(s, dtype=[('myint','i8'),('myfloat','f8'),
... ('mystring','S5')], delimiter=",")
>>> data
array((1, 1.3, 'abcde'),
      dtype=[('myint', '<i8'), ('myfloat', '<f8'), ('mystring', '|S5')])
Run Code Online (Sandbox Code Playgroud)

但让我演示一下如何访问此类数据

In [361]: txt=b"""A, 1,2,3
     ...: B,4,5,6
     ...: """
In [362]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=('S1,int,float,int'))
In [363]: data
Out[363]: 
array([(b'A', 1, 2.0, 3), (b'B', 4, 5.0, 6)], 
      dtype=[('f0', 'S1'), ('f1', '<i4'), ('f2', '<f8'), ('f3', '<i4')])
Run Code Online (Sandbox Code Playgroud)

所以我的数组有 2 条记录(检查形状),它们在列表中显示为元组。

您可以fields按名称访问,而不是按列号访问(我需要添加结构化数组文档链接吗?)

In [364]: data['f0']
Out[364]: 
array([b'A', b'B'], 
      dtype='|S1')
In [365]: data['f1']
Out[365]: array([1, 4])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我选择dtype带有“子数组”的数组可能会更有用。这是一个更高级的数据类型主题

In [367]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=('S1,(3)float'))
In [368]: data
Out[368]: 
array([(b'A', [1.0, 2.0, 3.0]), (b'B', [4.0, 5.0, 6.0])], 
      dtype=[('f0', 'S1'), ('f1', '<f8', (3,))])
In [369]: data['f1']
Out[369]: 
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
Run Code Online (Sandbox Code Playgroud)

字符列仍加载为S1,但数字现在位于 3 列数组中。请注意,它们都是浮点数(或整数)。

In [371]: from scipy import stats
In [372]: stats.describe(data['f1'])
Out[372]: DescribeResult(nobs=2, 
   minmax=(array([ 1.,  2.,  3.]), array([ 4.,  5.,  6.])),
   mean=array([ 2.5,  3.5,  4.5]), 
   variance=array([ 4.5,  4.5,  4.5]), 
   skewness=array([ 0.,  0.,  0.]), 
   kurtosis=array([-2., -2., -2.]))
Run Code Online (Sandbox Code Playgroud)