Numpy
Numpy库介绍:
Numpy是一个功能强大的python库,主要用于对多维数组执行计算。Numpy这个词来源于两个单词–Numerical和Python。Numpy提供了大量的库函数和操作,可以帮助程序员轻松进行数值计算,在数据分析和机器学习领域广泛使用,它有以下几个特点:
- numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动并行计算。
- numpy底层使用c语言编写,内部解除了GIL(全局解释锁)其对数组的操作速度不受python解释器的限制,效率远高于纯python代码
- 有一个强大的N维数组对象Array(一种类似于列表的东西)
- 实用的线性代数,傅里叶变换和随机生成函数
总而言之,它是一个非常高效的用于处理数值型运算的包
安装:
pip install numpy # 使用anaconda不需要安装
Numpy数组和Python列表的性能对比
# python列表的方式
t1 = time.time()
a = []
for x in range(100000):
a.append(x**2)
t2 = time.time()
t = t2-t1
print(t) # 0.11802864074707031
# numpy数组的方式
t3 = time.time()
b = np.arange(100000)**2
t4 = time.time()
print(t4-t3) # 0.0029997825622558594
Numpy中的数组:
numpy中的数组的使用跟python中的列表非常类似,他们之间的区别如下:
- 一个列表中可以存放多种数据类型,比如a = [1,‘a’]是允许的,而数组只能存放同种数据类型
- 数组可以是多维的,当多维数组中所有的数据都是数值类型的时候,相当于线性代数中的矩阵,是可以相互进行运算的。
创建数组(np.ndarray对象):
Numpy经常和数组打交道,因此首先第一步要学会创建数组,在Numpy中的数组的数据类型叫ndarray,两种创建方式如下:
- 根据python中的列表生成:
import numpu as np
a1 = np.array([1,2,3,4])
print(a1)
print(type(a1))
- 使用np.arange()生成,np.arange的用法类似于python中的range
import numpy as np
a2 = np.arange(2,21,2)
print(a2)
- 使用np.random生成随机数的数组:
a1 = np.random。random((3,3)) # 生成3行3列的随机数的数组
a2 = np.random.randint(0,10,size=(3,3)) # 元素是从0-10之间随机的3行3列的数组
- 使用函数生成特殊的数组:
import numpy as np
a1 = np.zeros((2,2)) # 生成一个所有元素都是0的2行2列的数组
a2 = np.ones((3,2)) # 生成一个所有元素都是1的3行2列的数组
a3 = np.full((2,2),8) # 生成一个所有元素都是8的2行2列的数组
a4 = np.eye(3) # 生成一个在斜方向上元素为1,其它元素都为0的3行3列的数组(主对角线)
# np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None),retstep为True时会显示间距
a5 = np.linspace(0,50,11,dtype='i',retstep=True) # 生成等差数组
# np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)base表示以10为底的对数
# start=base**start,stop=base**base,num表示生成的个数
# numpy.empty(shape, dtype = float, order = 'C')创建指定维数的数组
# numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组,dtype表示数据类型,order表示在行方向上还是列方向上,C表示行F表示列
ndarray的数据类型:
数据类型 | 唯一标识符 |
布尔型 | ‘b’ |
整型(有符号) | ‘i’ |
浮点型 | ‘f’ |
无符号整型 | ‘u’ |
时间间隔 | ‘m’ |
日期时间 | ‘M’ |
python(对象) | ‘O’ |
字符串(字节) | ‘S’或者’S20’,a |
自定义数据类型:相当于C语言的结构体
student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')])
a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student)
print(a)
修改数据类型:
import numpy as np
a1 =np.array([1,2])
print(a1.dtype) # windows系统下默认是int32
# 修改dtype属性
a2 = a1.astype(np.int64) #astype不会修改数组本身,而是将修改后的结果返回
print(a2.dtype)
ndarray数组属性:
- ndarray.ndim:数组的维度
a1 = np.array([1,2,3])
print(a1.ndim) # 维度为1
a2 = np.random.randint(0,10,(3,4))
print(a2.ndim) # 维度为2
a3 = np.array([[[1,2,3],[4,5,6]]])
print(a3.ndim)
- ndarray.shape:数组维度的元组
a1 = np.array([1,3,2])
print(a1.shape) # 输出(3,)意思是一维数组,有3个数据
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.shape) # 输出(2,3)意思是二维数组,2行3列,也可以理解为2个一维数组,每个维度有3个数据
a3 = np.array([[[1,2,3],[4,5,6]],[[1,8,3],[4,9,6]]])
print(a3.shape) # 输出(2,2,3)表示3维数组
# shape返回的元组有几个元素就代表几维数组
- ndarray.size:求出数组元素的总个数
- ndarray.itemsize:数组中每个元素所占的字节数
- ndarray.reshape:可以修改数组的形状,条件只有一个,就是修改后的形状的元素的个数必须和原来的个数一致。并且不会影响原数组的形状。
ndarray切片和索引:
- 使用:号进行切片,它和python中的切片类似
import numpy as np
a = np.arange(10)
s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2
# 也可以a[2:7:2]
print (a[s])
- 切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print (a[...,1]) # 第2列元素
print (a[1,...]) # 第2行元素
print (a[...,1:]) # 第2列及剩下的所有元素