Numpy的基础

        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中取索引的时候,可以多个一起操作,与操作时候的方式有关系。最终得到的与使用的方式有关的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值