我使用以下代码来创建numpy-ndarray。该文件有9列。我显式地键入每一列:
dataset = np.genfromtxt("data.csv", delimiter=",",dtype=('|S1', float, float,float,float,float,float,float,int))现在我想获取每一列的描述性统计信息(min、max、stdev、mean、median等)。难道不应该有一种简单的方法来做到这一点吗?
我试过这个:
from scipy import stats
stats.describe(dataset)但这将返回一个错误:TypeError: cannot perform reduce with flexible type
如何获取创建的NumPy数组的描述性统计信息?
发布于 2016-07-26 16:14:34
这不是一个很好的解决方案,但它可以完成工作。问题是,通过指定多个数据类型,您实际上是在创建一个元组的一维数组(实际上是np.void),它不能由统计信息描述,因为它包括多种不同的类型,包括。字符串。
这可以通过分两轮阅读,或者在read_csv中使用pandas来解决。
如果您决定坚持使用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)请注意,在本例中,最后一个数组将dtype作为float,而不是int,但可以使用arr.astype(int)轻松地(如果需要)将其转换为int
发布于 2020-06-08 12:26:44
import pandas as pd
import numpy as np
df_describe = pd.DataFrame(dataset)
df_describe.describe()请注意,dataset是您要描述的np.array。
import pandas as pd
import numpy as np
df_describe = pd.DataFrame('your np.array')
df_describe.describe()发布于 2016-07-27 01:01:57
如何处理来自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')])但是让我演示一下如何访问这种数据
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')])因此,我的数组有2条记录(检查形状),它们在列表中显示为元组。
您可以通过名称而不是列号来访问fields (我需要添加结构化数组文档链接吗?)
In [364]: data['f0']
Out[364]:
array([b'A', b'B'],
dtype='|S1')
In [365]: data['f1']
Out[365]: array([1, 4])在这样的情况下,如果我选择一个带有‘dtype’的子数组可能会更有用。这是一个更高级的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.]])字符列仍然加载为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.]))https://stackoverflow.com/questions/38583738
复制相似问题