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)
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)
如何处理混合数据的问题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)
| 归档时间: |
|
| 查看次数: |
35918 次 |
| 最近记录: |