【问题标题】:Best way to separate data into 3 classes将数据分成 3 类的最佳方法
【发布时间】:2014-06-26 00:26:54
【问题描述】:

我有一个 numpy 数组作为

[['6.5' '3.2' '5.1' '2.0' 'Iris-virginica'] 
['6.1' '2.8' '4.0' '1.3' 'Iris-versicolor'] 
['4.6' '3.2' '1.4' '0.2' 'Iris-setosa']
['6.0' '2.2' '4.0' '1.0' 'Iris-versicolor']
['4.7' '3.2' '1.3' '0.2' 'Iris-setosa']
['6.7' '3.1' '5.6' '2.4' 'Iris-virginica']]

根据标签 'Iris-virginica''Iris-setosa''Iris-virginica' 将此数据分成 3 个单独的 numpy 数组的最快方法是什么,以便

Iris-virginicaarray 仅包含 [['6.5' '3.2' '5.1' '2.0']['6.7' '3.1' '5.6' '2.4']]

Iris-setosaarray 仅包含 [['4.6' '3.2' '1.4' '0.2'] ['4.7' '3.2' '1.3' '0.2']]

Iris-versicolorarray 仅包含 [['6.1' '2.8' '4.0' '1.3']['6.0' '2.2' '4.0' '1.0']]

【问题讨论】:

  • 不清楚你在问什么。您有每个具有不同值的重复“类”。另外,您希望如何计算协方差?关于其他所有“类”?
  • CoDA 课程的同路人?
  • @Ffisegydd:我换了个问题。
  • FWIW 使用pandas 会简单得多;你基本上想要groupby + mean IIUC。

标签: python python-2.7 python-3.x numpy pandas


【解决方案1】:

使用numpy 并列出comprehension

import numpy as np

data = [['6.5', '3.2', '5.1', '2.0', 'Iris-virginica'],
['6.1', '2.8', '4.0', '1.3', 'Iris-versicolor'] ,
['4.6', '3.2', '1.4', '0.2', 'Iris-setosa'],
['6.0', '2.2', '4.0', '1.0', 'Iris-versicolor'],
['4.7', '3.2', '1.3', '0.2', 'Iris-setosa'],
['6.7', '3.1', '5.6', '2.4', 'Iris-virginica']]

filtered = [map(float, item[:4]) for item in data if item[4] == 'Iris-virginica']
print 'mean', np.mean(filtered, axis=0)
print 'var ', np.var(filtered, axis=0)

其中item[4] == 'Iris-virginica' 过滤您想要的内容,map(float, item[:3]) 用于strfloat,然后np.mean(..., axis=0) 用于获取过滤数据的mean

输出是

mean [ 6.6   3.15  5.35]
var  [ 0.01    0.0025  0.0625]

更新

这里是numpy 唯一版本,但这似乎比上面的要慢。

data = np.array(data)
filtered = data[data[:, 4] == 'Iris-virginica'][:, :3].astype(np.float)
print 'mean', np.mean(filtered, axis=0)
print 'var ', np.var(filtered, axis=0)

timeit 结果是

In [5]: %timeit filtered = [map(float, item[:4]) for item in data if item[4] == 'Iris-virginica']
100000 loops, best of 3: 1.93 µs per loop

In [6]: data = np.array(data)

In [7]: timeit data[data[:, 4] == 'Iris-virginica'][:, :4].astype(np.float)
100000 loops, best of 3: 15.5 µs per loop

【讨论】:

  • 感谢您的帮助。我稍微改变了我的问题
  • 次要:我认为您想要[:4],而不是[:3],或者您正在跳过一列数据。
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 2011-02-06
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
相关资源
最近更新 更多