前面
Python作为一种弱类型语言,虽身带高效开发的BUFF,但同时也有着不出众的运行性能。由于数据类型的判断是在解释器内部进行,所以对于每一个变量操作后都要重新判断数据类型,这势必增加解释器的负担。为了解决这一矛盾,同时扩充Python数据类型,numpy(以下简称np)就应运而生了。np不仅提供了诸如整数数组,线性方程、矩阵的相关数据类型,还可以进行一系列的操作运算,同时由于底层代码用C编写的,所以运行起来性能也不错。在数据分析、大数据、机器学习,神经网络方面都可以看到np的身影。在学习np之前,先来补充python的其它常用数据技巧:
数组解压
>>>list1 = [1,2,3,4,['a','b','c']]
>>>var1, var2, var3, var4, vars1 = list1
1 2 3 4 ['a', 'b', 'c', 'd']
通过上面这种方法可以使用多个变量去接收一个list(或者tuple)结构。
当然,我们知道Python可以使用星号+变量名来将多出的元素保存到一个元组中:
>>>*vars1, var1 = list
>>>vars1, var1
([1, 2, 3, 4], ['a', 'b', 'c', 'd'])
可以看出使用星号后,只会为list最后几个元素保留,其它元素都归星号的元素接收,以下写法更加明显:
>>>var1,*vars1 = list1
>>>var1,*vars1
(1, 2, 3, 4, ['a', 'b', 'c', 'd'])
继续多分配几个数组:
>>>var1,var2,var3,*vars1 = list1
>>>var1,var2,var3,vars1
(1, 2, 3, [4, ['a', 'b', 'c', 'd']])
可以看出星号所包含的变量总会在最后被分配。
这个方法有什么实用意义呢,比如有以下字符串:
'By777:20:Python:Linux:Web'
可以使用上面的方式来提取有用的信息:
>>>str = 'By777:20:Python:Linux:Web'
>>>name, age, *tools = str.split(':')
定长列表
定长列表常常用来处理消息队列,作用类似于栈,我们可以使用下面方式来很方便的使用消息队列:
>>>from collections import deque
deque可以看作list的加强版本,可以设置最大长度:
>>>d = deque(maxlen=10)
>>>for i in range(12):d.append(i)
>>>d
deque([2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
可以看出第11个元素将第一个元素1压了出去。
当然我们还可以使用appendleft方法逆向压入构建逆序。
元素查找
有以下列表:
>>>list2 =list(range(5))
>>>list2
[0, 1, 2, 3, 4]
我们可以使用heapq库进行信息提取:
>>>import heapq
>>>heapq.nlargest(3,list2)
[4, 3, 2]
除此之外,我们还可以定义一个函数:
>>>def myfun(c):
>>>if c>50:
>>> return c**0.5
>>>return c
>>>heapq.nlargest(2,list2,key=myfun)
[4, 3]
这样,将会使用list中的数以key的返回值作为判断依据。
多值映射
>>>from collections import defaultdict
>>>d = defaultdict(list)
>>>d
defaultdir(list,{})
这样我们就构建了一个默认的key对应values默认为list类型的字典
那么我们就可以继续进行赋值操作:
>>>d['a'].append(1)
>>>d
defaultdict(list, {'a': [1]})
……
>>>d
defaultdict(list, {'a': [1, 1, 2]})
同样,也可以定义为set类型:
>>>d_set = defaultdict(set, {})
>>>d_set['a'].add(1)
>>>d_set
defaultdict(set, {'a': {1}})
有序字典
>>>from collections import OrderedDict
使用有序字典的好处是的键值的顺序是按照添加的顺序进行的:
>>>od = OrderedDict()
>>>od['a'] = 1
>>>od['c'] = 3
>>>od['d'] = 2
>>>od
OrderedDict([('a', 1), ('c', 3), ('d', 2)])
如果使用默认字典对比明显:
>>>d = {}
>>>d['a'] = 1
>>>d['c'] = 2
>>>d['b'] = 3
>>>d
{'a': 1, 'b': 3, 'c': 2}
字典运算
Python原生字典是可以进行诸如+、-、&、min、zip等运算的:
但是原生字典和OrderedDict不能直接运算:
>>>d_cm -od
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-81-3c5177967520> in <module>()
----> 1 d_cm -od
TypeError: unsupported operand type(s) for -: 'dict' and 'collections.OrderedDict'
我们要使用items方法:
>>>d_cm.items() - od.items()#只存在与d_cm不存在与od的元素
{('bar', 2), ('foo', 1), ('script', 3), ('test', 4)}
>>>d_cm.keys() & od.keys()
此外,还有一下操作:
>>>d_cm = {'bar':2,'foo':1,'script':3}
>>>min(d_cm,key=lambda k:d_cm[k])#需要通过函数
'foo'
>>>sorted (d_cm,key=lambda k
['foo', 'bar', 'script']
>>>min(zip(d_cm.values(),d_cm.keys()))
(1, 'foo')