为什么使用numpy
numpy是Python的一种开源的科学计算库
NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
ndarray到底跟原生python列表的区别:
ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。
这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。
numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。
Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于纯Python代码。
几种数组类型的比较
一.python中的List
(1)数组生成方法
L= [i for i in range(5)]
L=[1,2,3,4,5]
(2) 数组元素修改方法
L[5] = 'welcome to dataAnalysis'
(3)添加元素
- append() 追加单个元素到List的尾部,只接受一个参数,参数可以是任何数据类型,被追加的元素在List中保持着原结构类型。此元素如果是一个list,那么这个list将作为一个整体进行追加,注意append()和extend()的区别。
- extend() 将一个列表中每个元素分别添加到另一个列表中,只接受一个参数;extend()相当于是将list B 连接到list A上。
- insert() 将一个元素插入到列表中,但其参数有两个(如insert(1,”g”)),第一个参数是索引点,即插入的位置,第二个参数是插入的元素。
- 加号,将两个list相加,会返回到一个新的list对象,注意与前三种的区别。前面三种方法(append, extend, insert)可对列表增加元素的操作,他们没有返回值,是直接修改了原数据对象。 注意:将两个list相加,需要创建新的list对象,从而需要消耗额外的内存,特别是当list较大时,尽量不要使用“+”来添加list,而应该尽可能使用List的append()方法。
L.append('jdc')
(4) 删除元素
1.使用del删除对应下标的元素
2.使用.pop()删除最后一个元素
3.删除指定值的元素 remove
4.使用切片来删除
del L[0] #对应下标的元素
L.pop()
L.remove(1) #对应元素
(4)List中可以存储不同类型的数据,不对存储类型进行检查,缺点,性能低要检查每个元素的类型
2.array模块
(1)使用之前要引入模块
import array
(2)Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组,也没有各种运算函数。因而不适合数值运算
(3)具体使用见下链接
https://www.cnblogs.com/dengyg200891/p/4946399.html
三、Numpy模块
1.创建数组/矩阵的方法
(1)指定元素直接创建
(2)使用循环指定元素
(3)使用函数生成
zeros
eye
ones
arange
linspace
full
****************
numpy.array([1,2,3,4]) #生成一维数组
numpy.array([[1,2,3],[4,5,6]]) #生成二维矩阵
***************
numpy.array([i for i in range(10)]) #生成一维数组
numpy.array([i for i in range(15)]).reshape(3,5)#使用reshape变成二维矩阵
***************
#生成全零数组/矩阵
numpy.zeros(10)
numpy.zeros(10).reshape(2,5)
numpy.zeros((2,2)) #可指定元组,直接生成矩阵,代表行列数量
np.zeros(shape=(3,5),dtype=int)
#生成对角矩阵
numpy.eye(10)
#生成全1数组/矩阵,可指定元素的数据类型
numpy.ones(10,dtype=int)
numpy.ones(10,dtype=int).reshape(2,5)
#生成数组/矩阵里面元素的所有值都一样
numpy.full(10,10)
np.full((3, 5), 666) #后面指定元素的值
np.full((3, 5), fill_value=666.6)
#直接生成
numpy.arange(10)
out:array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(0, 20 , 2) #指定起始和结束位置以及步长
np.arange(0, 10) #默认步长为1
np.linspace(0, 20 , 10) #生成等间距的数组,起始位置结束位置+元素的个数
2.numpy随机数
(1)生成随机整数
numpy.random.randint(1,10) #生成[1,10) 之间的整数
numpy.random.randint(1,10,size=20) #生成随机数组
numpy.random.randint(1,10,size=(2,3)) #生成随机矩阵
(2)生成随机浮点数
numpy.random.random(10)
np.random.random() #生成[0, 1) 随机浮点数
np.random.random(10) #生成[0, 1) 随机浮点数
np.random.random((3, 5)) #生成[0, 1) 随机浮点数
(3)生成指定均值和方差的浮点数
np.random.normal() #均值为0 方差为1 随机浮点数
np.random.normal(10, 100) #均值为10方差为100 随机浮点数
np.random.normal(0, 1, (3, 5)) #
3.修改元素值
可直接修改
nparr[5] = 100
4.numpy其他
(1)查看元素的数据类型
nparr.dtype #numpy对象名.dtype
(2)numpy数据类型如果数据类型不匹配要进行数据类型转换,则进行截位操作,不进位
(3)数据类型转换
直接调用函数
npz.astype(float)