我使用以下代码创建一个numpy-ndarray。该文件有9列。我显式输入每列:
dataset = np.genfromtxt("data.csv", delimiter=",",dtype=('|S1', float, float,float,float,float,float,float,int))
现在我想得到每一列的一些描述性统计数据(最小值、最大值、标准差、平均值、中位数等)。难道没有一种简单的方法来做到这一点吗?
我试过这个:
from scipy import stats
stats.describe(dataset)
但这会返回一个错误:TypeError: cannot perform reduce with flexible type
如何获取创建的NumPy数组的描述性统计信息?
5条答案
按热度按时间jc3wubiy1#
请注意,dataset是要描述的np.array。
zvms9eto2#
这不是一个漂亮的解决方案,但它完成了工作。问题是,通过指定多个dtypes,你本质上是在制作一个元组的1D数组(实际上是
np.void
),它不能用stats描述,因为它包含多个不同的类型,包括字符串。这可以通过分两轮阅读来解决,或者使用pandas和
read_csv
。如果您决定坚持使用
numpy
:请注意,在本例中,最终数组的
dtype
为float
,而不是int
,但可以轻松地(如果需要)使用arr.astype(int)
转换为intt3irkdon3#
如何处理来自
genfromtxt
的混合数据的问题经常出现。人们期望一个2d数组,而不是得到一个不能按列索引的1d数组。这是因为他们得到的是一个结构化数组-每个列都有不同的dtype。genfromtxt
文档中的所有示例都显示了这一点:但让我来演示如何访问这类数据
所以我的数组有两个记录(检查形状),它们在列表中显示为元组。
通过名称而不是列号访问
fields
(我需要添加结构化数组文档链接吗?)在这种情况下,如果我选择一个带有'subarrays'的
dtype
可能会更有用。字符列仍然作为
S1
加载,但是数字现在在3列数组中。请注意,它们都是float(或int)。fkvaft9z4#
官方Scipy文档Example
1hdlvixo5#
对于那些需要快速计算的人来说,scipy + numpy比pandas更快:
加上在
describe()
pandas中没有提取 * 峰度 * 和 * 偏度 *警告:使用
pd.DataFrame(array).describe()
速度较慢: