NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。
NumPy提供了一个N维数组类型ndarray,它描述了相同类型的“items”的集合。
从图中我们可以看出ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。
一、一维数组
1.1数组与列表的不同之处
首先用平时熟悉的列表对比数组,进而初步认识什么是数组。使用numpy需要安装numpy库,安装方法:pip install numpy,安装好之后导入nump库,代码如下
import numpy as np
LIST = [1,3,5,7]
ARR = np.array(LIST)
print(type(ARR))
输出结果为:
<class ‘numpy.ndarray’>
可以看到输出结果是numpy类型了
接下来了解列表索引与数组索引,编写代码访问数组中的元素
import numpy as np
LIST = [1,3,5,7]
ARR = np.array(LIST)
print(LIST[0]) #打印数组的第一个元素,学过数组的都应该知道数组里面的元素是从第0个开始的
print(ARR[0])
print(ARR[2:]) #打印第2个和第2个后面的元素
输出结果:
1
1
[5,7]
从上述例子中可以发现列表与数组有着相同的元素和相同的索引机制,为什么还要引入Numpy包呢?其实列表与数组之间的首要区别是:数组是同类的,就是说数组的所有元素必须具有相同的类型。相反,列表可以包含任意类型的元素,例如可以将上面列表中的最后一个元素更改为一个字符串
LIST[-1] = 'string'
print(LIST)
输出结果为:[1,3,5,‘string’]
ARR[-1] = 'string'
print(ARR)
而上述代码则会报错,报错的原因是因为元素无效
ARR[-1] = 'string'
ValueError: invalid literal for int() with base 10: 'string'
也就是说一旦创建了一个数组,那么它的dtype也就固定了,它只能存储相同类型的元素。那么如何确定数组内的数据类型以保证正确的数据格式?其实有关数组类型的信息均包含在数组的dtype属性中。接下来访问数组中元素的数据类型,代码如下
print(ARR.dtype)
输出结果为:int32
上述结果显示ARR数组中的数据类型为整数类型。**如果为整数类型数组中添加字符串会怎么样呢?系统会因无法识别该数据类型而报错。**那么添加一个浮点类型的结果会怎样呢?事实证明,当存储一个浮点数据类型的时候,系统会自动将其转化为整数类型,代码如下
ARR[-1] = 1.2345
print(ARR)
输出结果为:
[1 3 5 1]
1.2数组的创建
在创建数组的时候,通常用一个常量值(一般为0或1)初始化一个数组,这个值通常是作为加法和乘法循环的起始值,创建实例代码如下:
import numpy as np
num = np.zeros(5,dtype=float) #这里创建浮点数类型全为零的数组
print(num)
num1 = np.zeros(3,dtype=int) #这里创建整数类型全为零的数组
print(num1)
num2 = np.ones(5) #这里创建了值全为1的数组
print(num2)
num3 = np.ones(4)
num3.fill(5.5) #填充值为5.5
print(num3)
输出结果为:
[0. 0. 0. 0. 0.]
[0 0 0]
[1. 1. 1. 1. 1.]
[5.5 5.5 5.5 5.5]
最后,创建常用的随机数字的数组,在numpy中,np.random模块包含许多可用于创建随机数组的函数,例如生成一个服从标准正态分布(均值为0和方差为1,高中的知识忘得差不多了!)的5个随机样本数组,代码如下
random = np.random.randn(5)
print(random)
输出结果为:
[-1.9083265 0.49668329 0.34133729 1.85447086 -0.85646652]
二、多维数组
上面使用的都是一维数组,其实Numpy可以创建N维数组对象(ndarray),也就是多个数组,这也是Numpy的一个关键特性,ndarray是一种快速并且节省空间的多维数组,它可以提供数组化算术运算和高级的广播功能。通过使用标准的数学函数,并不需要编写循环,便可以对整个数组的数据进行快速运算,除此之外ndarray还具备线性代数、随机数生成、和傅里叶变换的能力,总而言之ndarray是python中的一个具有计算快速、灵活邓特性的大型数据集容器,例如可以使用列表来初始化一个二维数组
import numpy as np
LIST2 = [[1,2],
[3,4]] #数组间用逗号隔开
ARR2 = np.array(LIST2)
print(ARR2)
输出结果为:
[[1 2]
[3 4]]
2.1多维数组的高效性能
(1)虽然可以使用[ ]运算符重复对嵌套列表进行索引,但多维数组支持更为自然的索引语法,只需一个[ ]和一组以逗号隔开的的索引即可,比如返回第一行第二列的数值,如下所示
import numpy as np
LIST2 = [[1,2],
[3,4]]
ARR2 = np.array(LIST2)
print(LIST2[0][1])
print(ARR2[0,1])
输出结果为:
2
2
结果均为2
比如返回2行3列的array,且值全部为0,如下所示
a = np.zeros((2,3))
print(a)
输出结果为:
[[0. 0. 0.]
[0. 0. 0.]]
返回2行4列的array,且值均为10,标准差为3的正态分布的随机数,代码如下
b = np.random.normal(10,3,(2,4))
print(b)
输出结果为:
[[10.44959384 14.13345576 13.30487452 6.54541624]
[12.65727715 6.07423367 13.9951299 9.27647173]]
(2)实际上,只要元素的总数不变,数组的形状就可以随意的改变,例如想要一个数字从9增加到2x4的数组,最简单的方法如下
array1 = np.arange(9)
print(array1)
array2 = array1.reshape(3,3)#也就是分为3行3列的意思
print(array2)
输出结果为:
[0 1 2 3 4 5 6 7 8]
[[0 1 2]
[3 4 5]
[6 7 8]]
(3)多为数组的索引切片
LIST = [[1,2,3],
[4,5,6]]
for i in LIST:
print(i[2])
print(LIST[0])
print(LIST[1])
输出结果为:
3
6
[1, 2, 3]
[4, 5, 6]
到这里,您是否感觉到了多为数组的高效与魅力呢?
正在尝试写博客,把会的分享给你们,如有写的不好的地方,希望指点一下,谢谢!