科学计算库—NumPy
NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
NumPy包的核心是 ndarray 对象。它封装了python原生的同数据类型的 n 维数组,为了保证其性能优良,其中有许多操作都是代码在本地进行编译后执行的。
NumPy数组 和 原生Python Array(数组)之间有几个重要的区别:
- NumPy 数组在创建时具有固定的大小,与Python的原生数组对象(可以动态增长)不同。更改ndarray的大小将创建一个新数组并删除原来的数组。
- NumPy 数组中的元素都需要具有相同的数据类型,因此在内存中的大小相同。 例外情况:Python的原生数组里包含了NumPy的对象的时候,这种情况下就允许不同大小元素的数组。
- NumPy 数组有助于对大量数据进行高级数学和其他类型的操作。通常,这些操作的执行效率更高,比使用Python原生数组的代码更少。
越来越多的基于Python的科学和数学软件包使用NumPy数组; 虽然这些工具通常都支持Python的原生数组作为参数,但它们在处理之前会还是会将输入的数组转换为NumPy的数组,而且也通常输出为NumPy数组。换句话说,为了高效地使用当今科学/数学基于Python的工具(大部分的科学计算工具),你只知道如何使用Python的原生数组类型是不够的 - 还需要知道如何使用 NumPy 数组。
一.创建数组
1. 根据Python现有数据类型创建数组
numpy中使用array()函数创建数组,该函数需要接收一个列表或者元组,例如,使用array()函数创建一个一维数组,代码如下:
import numpy as np#导入numpy库
array1=np.array([1,2,3,4])#创建一维数组
print(array1)
[1 2 3 4]
使用array函数创建数组时,还可以传入一个嵌套列表,以创建一个多维数组,例如使用array函数创建一个二维数组和三维数组,代码如下:
array2=np.array([[1,2,3],[3,4,5]])
print(array2)
print('____________________')
list1=[1,2,3]
list2=[2,3,4]
array3=np.array([[list1,list2],[list1,list2]])
print(array3)
[[1 2 3]
[3 4 5]]
[[[1 2 3] [2 3 4]]
[[1 2 3] [2 3 4]]]
2.根据指定数值创建数组
NumPy中使用zeros(),ones(),empty()函数能够指定数值创建数组。其中zeros函数创建元素值都是的数组,ones函数创建元素都是1的数组,empty创建元素值都是随机数的数组,其使用语法如下:
np.zeros(shape,dtype=,order=)
np.ones(shape,dtype=,order=)
np.empty(shape,dtype=,order=)
以上三个函数都接收相同的参数,这些参数的含义如下:
- shape:表示数组的形状
- dtype表示数组中元素的类型,默认为浮点数
- order表示按索引顺序读取数组的元素
例:创建一个两行三列的元素值为0的数组
demo1=np.zeros((2,3))
print(demo1)
[[0. 0. 0.]
[0. 0. 0.]]
例:创建一个两行三列的元素值为1的数组
demo2=np.ones((2,3))
print(demo2)
[[1. 1. 1.]
[1. 1. 1.]]
例:创建一个两行三列的元素值为随机整数的数组
demo3=np.empty((3,3),dtype='int')
print(demo3)
[[1732 327 10]
[ 542 0 0]
[1731 327 0]]
3.根据指定数值创建范围的数组
NumPy使用arange函数创建指定区间均值分布数值的数组
例:创建一个元素值位于[1,30]且间隔为5的数组
array_demo1=np.arange(1,31,5)#这里是31
print(array_demo1)
[ 1 6 11 16 21 26]
arrange函数可以搭配reshape函数使用,以重塑一维数组的形状。例如,将数组array_demo1重塑为二行三列的二维数组:
array_demo2=array_demo1.reshape((2,3))
print(array_demo2)
[[ 1 6 11]
[16 21 26]]
二.访问数组元素
1.使用整数索引访问元素
Numpy中可以使用整数索引访问数组,以一维数组为例
sb=np.arange(1,10,2)
print(sb)
print(sb[2])#获取索引为2的元素值(即第三个元素值,python从0开始)
[1 3 5 7 9]
5
当使用整数索引访问二维数组时,二维数组会根据索引获取相应位置的一行元素,例;
sb1=np.arange(1,9).reshape(2,4)#将1到8重塑为2行四列数据
print(sb1)
print(sb1[1])#输出第2行
此时,如果想获取二维数组的某个元素,需要通过行索引和列索引的方式
print(sb1[1,2])#第二行第三个元素
7
2.使用花式索引或布尔索引访问元素
1.花式索引
- 一维数组
import numpy as np
array11=np.arange(1,10)
print(array11[[2,3,4]])#
[3 4 5]
- 二维数组
array12=np.arange(1,10).reshape((3,3))
print(array12)
print("__________________")
print(array12[[1,2]])#访问数组的第二,第三行元素
2.布尔索引
布尔索引,就是将元素都是布尔值的数组作为索引在另一个数组中取出元素的做法
import numpy as np
ab=np.arange(1,10).reshape((3,3))
print(ab)
print("__________")
print(ab>=5)#输出数组各个元素是否大于等于5
print("_____________")
print(ab[ab>=5])#输出数组大于等于的元素
3.使用切片访问元素
- 一维数组的切片访问
import numpy as np
array11=np.arange(1,10)
print(array11[[2,3,4]])
array12=np.arange(1,10).reshape((3,3))
print(array12)
print("__________________")
print(array12[[1,2]])
- 二维数组的切片访问
import numpy as np
arr1=np.array([[1,2,3],[2,3,4],[3,3,4]])
print(arr1)
print("_______")
print(arr1[:2])#使用切片访问前两行的元素
传入两个切片的代码如下:
print(arr1[:2,0:1])#使用切片访问前两行、第一列的数据
print(arr1[:2,1])#使用切片访问前两行、第二列的数据
三.数组操作
1.排序
sort(axis=-1,kind=None,order=None)
- axis:表示排序的轴编号,默认为-1,代表沿着最后一个轴排序
- kind:表示排序的算法,默认为‘quicksort’(快速排序)
- order:表示按哪个字段排序
import numpy as np
a=np.array([[100,2,3],[2,3,4],[8,4,5]])
b=a
print(a)
a.sort()#对每一行按照从小到大的顺序排序
print(a)
a.sort(axis=0)#对每一列按照从小到大的顺序排序
print(a)
2.元素唯一化
使用unique函数查找数组的唯一元素
import numpy as np
c=np.array([[2,2,3],[2,3,4],[8,4,5]])
print(np.unique(c))
[2 3 4 5 8]
三.数组的转置
import numpy as np
arr=np.arange(1,9).reshape((2,4))
print(f'arr形状:{arr.shape}')
print(arr)
1.使用T属性进行转置
newarr=arr.T
print(newarr)
print(f'newarr形状{newarr.shape}')