python中统计特征

1.np.sum(a,axis=None,dtype=None)

    发现对于布尔运算的结果,np.sum()只是返回其中True的个数。如:

>>> np.sum(np.array([True,False,True,False,False,True]))
      
3

用在统计样本中各类元素个数中:

from sklearn import datasets
iris = datasets.load_iris()
x = iris.data
data = x[0]  # 数据集中第一个属性
features = set(data)  # data中各不同的特征
tmp = [data == feature for feature in features]  # 返回的tmp是含35个元素的表,每个表中元素是150个元素的矩阵,矩阵中元素是布尔运算判别结果,True or False
>>>[np.sum(x) for x in tmp]
[2, 7, 9, 10, 6, 9, 4, 6, 3, 5, 7, 1, 1, 1, 3, 6, 4, 2, 5, 7, 6, 6, 1, 1, 1, 1, 8, 1, 4, 8, 4, 3, 1, 3, 4]

同样如同np.argsort(),或者np.argmax(a,axis=None).返回最大值的索引。

2.set(iterable)

set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

显然可以用来提取出所以类别

3.np.bincount(x,weights=None,minlength=0)

x 可以是列表,数组,weights是每个元素的权重,写成列表形式,如果weights不是None,则返回结果为权重的叠加和,其中每个元素是对应元素的权重的和。元素个数和x的元素个数是相同的,minlength是指定结果的长度,如果minlength被指定,那么输出数组中bin的数量至少为它指定的数(如果必要的话,bin的数量会更大,这取决于x)。

>>> np.bincount([2,3,3,4],weights=None,minlength=0)
      
array([0, 0, 1, 2, 1], dtype=int64)
>>> np.bincount(np.array([2,3,3,4]),weights=[0.5,0.4,-0.2,0.6],minlength=0)
      
array([0. , 0. , 0.5, 0.2, 0.6])
>>> np.bincount([0.2,0.3,0.3,0.4],weights=None,minlength=0)
      
array([4], dtype=int64)

注意到没法处理浮点数,因为他会把浮点数变成整数。

3.collcetions.Counter()

Counter()函数可以统计一维数组中不同元素及其出现次数。返回结果为一个字典,字典keys是元素的类别,values是类别对应出现次数。可以通过Counter(x).values(),和Counter(x).keys()来访问各类别出现次数,和类别。当然是列表形式。只能以for循环访问具体元素。

>>> d=np.random.randint(1,5,size=7)      
>>> d      
array([2, 4, 3, 4, 2, 2, 2])
>>> Counter(d)     
Counter({2: 4, 4: 2, 3: 1})
>>> Counter(d).values()      
dict_values([4, 2, 1])
>>> Counter(d).keys()      
dict_keys([2, 4, 3])
>>> for i in Counter(d).keys():
      print(i)

      
2
4
3

Counter统计对象可以是字符串,也可以是浮点数:

>>> a=np.array(['是','否','是','是','否','非',])
>>> from collections import Counter
>>> Counter(a)
Counter({'是': 3, '否': 2, '非': 1})
>>> Counter(np.array([0.1,0.3,0.5,0.8]))
Counter({0.1: 1, 0.3: 1, 0.5: 1, 0.8: 1})

这是他的优点,但是没法对每个元素加权,这也是没办法的。这时就需要bincount函数

counter由于返回的是字典,因此没法索引。如果一定要索引,就需要将字典类型转换。如list(counter(a)).这样就可以索引其中元素了.一般索引keys()或values()。


4.np.bincount(x, weights=None, minlength)

点击打开链接np.bincount详解

补充几点:

0.bincount对自然数统计,不管是否出现,如果对象中只有1,3,那么输出会补上0,2,虽然他们的出现次数都为0.

0.1. 输出的数组实际是对应元素的权重和,如果weights=None,则权重默认为1,否则就按加法计算。

1.bincount只能统计数字出现次数,不能统计字符串出现次数,如:

>>> a=np.array(['是','否','是','是','否','非',])
>>> np.bincount(a)
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module>
    np.bincount(a)
TypeError: Cannot cast array data from dtype('<U1') to dtype('int64') according to the rule 'safe'
>>> a=np.array(['a','c','d'])
>>> np.bincount(a)
Traceback (most recent call last):
  File "<pyshell#46>", line 1, in <module>
    np.bincount(a)
TypeError: Cannot cast array data from dtype('<U1') to dtype('int64') according to the rule 'safe'

2.数字必须是整数,不能是浮点数,如:

>>> np.bincount(np.array([0.1,0.3,0.5,0.8,2]))
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    np.bincount(np.array([0.1,0.3,0.5,0.8,2]))
TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'
>>> 

3.必须是自然数,不能是负数。例如:

>>> b=[-1,-2,1,1,2,3,6]
>>> b=np.array([b])
>>> np.bincount(b)
Traceback (most recent call last):
  File "<pyshell#32>", line 1, in <module>
    np.bincount(b)
ValueError: object too deep for desired array
4.bincount统计对象可以是列表,元组,但是也不许有字符串,或者负数,浮点数


5.enumerate(iterable)

enumerate()是内置函数,返回对应索引及其值,也是没法直接访问其中元素。

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

>>> d
array([2, 3, 4, 2, 3, 2])
>>> index_lst=[]  # 存放索引
>>> ele_lst=[]  # 存放元素
>>> from collections import Counter
>>> features=Counter(d).keys() # 找features也可用set(d)获取,都一样需要转变成list才能索引
>>> features
dict_keys([2, 3, 4])
>>> features=list(feautres)  # 如果不把feature变成列表格式就没法索引里面的元素
>>> for index,ele in enumerate(d):
	if ele == features[0]:
		ele_lst.append(ele)
		index_lst.append(index)
>>> index_lst
[0, 3, 5]
>>> ele_lst
[2, 2, 2]



6.filter(function,iterable)

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。


7.用判别语句实现分类统计

最简单的例子:

>>> d=[2,3,4,2,3,2]  # 定义一个列表
>>> d == 2  # 这里只能这这个判句
False
>>> d=np.array(d)  # 如果变成矩阵,就可以对所有元素进行判断了
>>> d == 2
array([ True, False, False,  True, False,  True])
>>> features=set(d)
>>> features
{2, 3, 4}

最好用矩阵判断。列表默认对整个表判断

>>> e=[d == feature for feature in features]
>>> e
[array([ True, False, False,  True, False,  True]), array([False,  True, False, False,  True, False]), array([False, False,  True, False, False, False])]

每个特征都对所有的元素遍历判别过了,返回结果是每个特征对应的判别结果,可以用来寻找每个特征对于的样本和输出。

如:

第一个特征也就是2对应的样本:

>>> d[e[0]]
array([2, 2, 2])





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值