Numpy是机器学习的大杀器,是对于python的一个扩充程序库,支持高维度大量的矩阵和数组的运算,并且提供了大量的数学函数库。对于Numpy而言,解除了python的PIL(全局解释器锁),运算效率得到极大的提高。
对于Python中的类型是dynamically typed(动态类型), 对于一个object, 里面有很多的信息, 如: a reference count, the type of the variable, size of the data, digit:actual interger value。
贴一个学习链接:http://www.runoob.com/numpy/numpy-dtype.html
对于numpy而言,数组类被称为了ndarray。
对于Python list而言,除了list的头部信息,长度信息,里面存储的各个索引对应的是每一个object, 包裹了一层又一层, 而对于numpy而言,除了头部信息等公共信息,存储的就是一个一个的数据,这样可以减少解析的时间。
对于python的list, 我们可以存在不同的类型的数据,而对于numpy,我们只能存储一个类型的数据。
import numpy as np
np_list1 = np.array([1, 2, 3, 4.0])
print np_list1
np_list2 = np.array([1, 2, 3], dtype='int')
np_list2[0] = 1.2
print np_list2
对于上面的程序,np_list1的数据类型为float, np_list2的数据类型是int。
一 numpy矩阵的创建工作
1)通过list,tuple来实现(注意传入的方式)
array(深拷贝的方式)
asarray(浅拷贝的方式)
2)通过numpy中的函数,zeros,ones,full来创建
3)通过随机函数(random)来创建
np.random.rand(10, 10) 产生(10, 10)维度的0到1之间的数字
np.random.randint(0, 100)产生100以内的整数,包括0和100的情况。
np.random.uniform(0, 100)产生100以内的数,也是闭口的情况。
np.random.normal(1.75, 0.1, (4,5)), 正态分布,第一个均值,第二个是标准差,第三个是shape。
4)通过arrange来创建
5)通过linspace(均匀间隔)的函数来创建
import numpy as np
np_list1 = np.array([1, 2, 3])
np_list2 = np.zeros((2, 3), dtype=int)
np_list3 = np.ones((2, 3), dtype=float)
np_list4 = np.full(shape=(2, 3), fill_value=2.33, dtype=float)
mean = 0
std = 1
np_list5 = np.random.normal(loc=mean, scale=std, size=(3, 3))
np_list6 = np.array([[1, 2, 3], [2, 3, 4]])
np_list7 = np.array([1, 2, 3]).reshape(3, 1)
np_list8 = np.arange(start=0, stop=10, step=2, dtype=int)
np_list9 = np.linspace(start=1, stop=10, num=6, dtype=int)
二 ndarray的数组类所拥有的属性
1)ndim数组的维度
2)shape数组的形状
3)size数组中的数据个数
4)dtype数组中元素的类型(除标准的numpy类型以外,还有numpy.int32, numpy.int16, numpy.float64)
5)itemsize数组中每个元素字节的大小
代码示例:
>>> import numpy as np
>>> a = np.arange(15).reshape(3,5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int64'
>>> a.dtype
dtype('int64')
>>> a.size
15
>>> a.itemsize
8
>>> type(a)
<class 'numpy.ndarray'>
>>>
>>> b = np.array([1,2,3,4,5,6,7,8,9])
>>> b
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> c = np.array([1,2,3,4,5,6,'7','a','b'])
>>> c
array(['1', '2', '3', '4', '5', '6', '7', 'a', 'b'], dtype='<U21')
>>> type(b)
<class 'numpy.ndarray'>
>>> type(c)
<class 'numpy.ndarray'>
>>> c.dtype
dtype('<U21')
>>> b.dtype
dtype('int64')
>>> c.itemsize
84
>>> b.itemsize
8
其中 < 代表字节顺序,小端(最小有效字节存储在最小地址中)
U 代表Unicode,数据类型
其中,reshape((1, -1))中的-1是指利用系统来完成计算, 但这个reshape这个操作并没有改变其本身。
三 numpy基本操作
1)reshape改变数组的形状,但这个操作并不改变原数组,所以需要额外进行赋值操作。
2)flatten(),进行扁平化操作, 将其变为一维的情况。
3)切片和索引的操作(索引是按行来进行的,取得是每一行的元素,为一个ndarray类型)
在这个地方, z = y[:, :,:]可能出现浅拷贝的问题,可以通过z = y[:, :, :].copy来实现。
import numpy as np
np_list = np.arange(9).reshape(3, 3)
print np_list
print np_list[-1]
print np_list[2]
print np_list[1:3]
print np_list.shape
np_list = np_list.flatten()
print np_list.shape
4)基本的运算
条件运算,然后得到的是一个同维度的True, False的矩阵。
np.where(a, b, c)三目运算符, a成立的话,执行b, a不成立的话,执行c。
np.any()存在True,即为True, 否则为False.
np.all()是否全部为True, 如果是为True,否则为False
np.nonzero(a)返回a中非零元素的坐标,一个元祖,第一个为行的情况(ndarray),第二个为列的情况(ndarray)
np.count_nonzero(a) 返回a中非零元素的个数
统计运算,np,max/np.amax/np.min/np.amin/np.mean/np.std,其中axis =1表示行的情况,axis= 0表示列的情况。
基本数学运算(这个地方可以利用到numpy的广播特性,主要要进行正确的传播和扩展)
基本的运算(+, -, *, /)
np.dot()矩阵乘法
np.multiply同维度的矩阵的乘法
np.add实现加法
np.add.at(ndarray, loc, num)在ndarray的loc位置加上num。
np.exp实现指数
当我们能用numpy,最好用numpy,可以加快我们的运算速度。
矩阵的拼接
np.vstack((a, b)) 竖直拼接
np.hstack((a, b)) 水平拼接
矩阵的分割
np.split(a, 3) 按行分为3个小的ndarray
np.vsplit(a, 3) 按行分为3个小的ndarray
np.hsplit(a, 4) 按列分为4个小的ndarray
利用numpy来读取数据:np.genfromtxt
5)常用的操作
a.flat 是ndarray的一个迭代器。
a.ravel() 与a.flatten()效果类似
a.T转置
reshape是不修改原数组,而是新建一个数组来接着。
resize是在原数组的基础上来进行修改的。
6) 复制和视图
= 赋值, 浅拷贝,二者指向同一块地址,改变一个也会改变另一个。
ndarray.view() 仅涉及到了值的复制,也就是改变值,二者都会变,但改变shape,二者不一定变。
ndarray.copy() 深拷贝,完整的拷贝,也就是一个完全独立的复制。
7)排序
axis = 1 代表行,axis = 0 代表列
np.sort(ndarray) 在ndarray上进行排序后返回的是一个新的ndarray,不改变原来的。
ndarray.sort()在原ndarray上进行改变。
np.argsort() 不改变原ndarray的情况下,返回的是排序之后的索引。
四 特殊需要注意的点
在numpy中使用and or,一定要注意,很容易出错,因为and和or是对于整个物体来进行比较的,比如二个矩阵,就不能用and和or,因为我们想要的是每一个bool(可以看做是每一个bit)的相比较。
在numpy中取索引的时候,可以多个一起操作,与操作时候的方式有关系。最终得到的与使用的方式有关的。