一、什么是NumPy
(一)工作环境的安装
使用的是Anaconda环境,它是一个集成的工作环境,方便管理各种包,这里提供一个版本的链接: https://pan.baidu.com/s/1pHqRTy_uwKMArtt8SvY6Tw 提取码: 3922 。在下载后按照指示进行安装即可。
注意安装完毕后需要进行环境变量的配置,在电脑的系统环境变量中进行配置,将Anaconda的安装路径以及scripts路径导入系统path中。

此时可以在左下角开始处打开Anaconda Prompt终端:
1、检查是否安装成功
(base) C:\Users\Administrator>conda --version conda 4.5.4
2、管理虚拟环境
-
查看所有的虚拟环境
(base) C:\Users\Administrator>conda info --envs # conda environments: # base * H:\Anaconda3 python35 H:\Anaconda3\envs\python35
-
创建新的虚拟环境
(base) C:\Users\Administrator>conda create -n python37 python=3.7
-
切换环境
(base) C:\Users\Administrator>activate python35 (python35) C:\Users\Administrator>
-
安装包
(python35) C:\Users\Administrator>conda install requests ##或者 (python35) C:\Users\Administrator>pip install requests
-
卸载包
(python35) C:\Users\Administrator>conda remove requests ##或者 (python35) C:\Users\Administrator>pip uninstall requests
-
查看包的信息
(python35) C:\Users\Administrator>conda list
-
导入导出环境
#导出环境 (python35) C:\Users\Administrator>conda env export > environment.yaml #导入新的虚拟环境 (python34) C:\Users\Administrator>conda env create -f environment.yaml
-
卸载虚拟环境
(python35) C:\Users\Administrator>conda remove --name python34 --all
(二)什么是NumPy
NumPy是使用Python进行科学计算的基础软件包。是一个运行速度非常快的科学计算库,因为它的底层逻辑是使用C语言实现的,NumPy的功能非常多,其主要功能包括:
- 功能强大的N维数组对象。
- 精密广播功能函数。
- 集成 C/C+和Fortran 代码的工具。
- 强大的线性代数、傅立叶变换和随机数功能。
在使用NumPy之前需要先进行它的环境搭建,在虚拟环境中只需要安装对应的包即可:
(python35) C:\Users\Administrator>conda install numpy
安装完毕后进行测试:
(python35) C:\Users\Administrator>python Python 3.5.2 |Continuum Analytics, Inc.| (default, Jul 5 2016, 11:41:13) [MSC v .1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import numpy as np >>>
二、NumPy的使用
(一)数组对象
1、属性
NumPy 最重要的一个特点是其 N 维数组对象(矩阵) ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。其特点如下:
- 所有元素必须是相同类型
- ndim属性,维度个数
- shape属性,各维度大小
- dtype属性,数据类型
- axis属性,轴参数
- size属性,数组元素的个数
举例说明:
import numpy as np #随机生成3行4列的数据 data = np.random.rand(3,4) print(data) ###########输出########## [[0.77006414 0.40472558 0.07331437 0.55188175] [0.80664964 0.84844352 0.08464626 0.67016604] [0.14836505 0.82259737 0.45900147 0.60369758]]
上述生成的是一个3行4列的矩阵:
print('维度个数',data.ndim) #维度个数 2
print('各维度大小',data.shape) #各维度大小 (3, 4)
print('数据类型',data.dtype) #数据类型 float64
需要着重强调一下axios参数,对于维度的转换或者,对某一个维度的操作都需要用到此参数:

>>> data = np.arange(10).reshape(2,5)
>>> data
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
#在横轴方向进行操作
>>> data.sum(axis=1)
array([10, 35])
#在纵轴方向进行操作
>>> data.sum(axis=0)
array([ 5, 7, 9, 11, 13])
>>>
2、创建数组
-
np.zeros, np.ones,np.empty
指定大小的全0或全1数组,值得注意的是:
(1)第一个参数是元组,用来指定大小,如(4,5)
(2)empty不是总是返回全0,有时返回的是未初始的随机值
#创建一维数组
>>> import numpy as np
>>> np.zeros(5,dtype=float)
array([0., 0., 0., 0., 0.]) #创建浮点型全为0的数组
>>> np.zeros(5,dtype=int)
array([0, 0, 0, 0, 0]) #创建整型全为0的数组
>>> np.ones(5)
array([1., 1., 1., 1., 1.]) #创建值全为1的数组
#创建一个空数组,然后将空数组使用fill方法进行填充
>>> a = np.empty(4)
>>> a
array([7.33483560e-315, 7.33405037e-315, 2.49174182e-316, 2.07211804e-316])
>>> a.fill(6)
>>> a
array([6., 6., 6., 6.])
>>>
#创建多维数组
>>> np.zeros((4,5))
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
>>> np.ones((4,5))
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
>>> np.empty((3,4))
array([[1.186e-321, 0.000e+000, 0.000e+000, 0.000e+000],
[0.000e+000, 0.000e+000, 0.000e+000, 0.000e+000],
[0.000e+000, 0.000e+000, 0.000e+000, 0.000e+000]])
>>> np.empty((3,4),int) #指定数据类型
array([[1484587258, 0, 1484587600, 0],
[1484428320, 0, 13996488, 0],
[ 7077996, 4784128, 84, 5006336]])
-
np.random 创建随机数的数组
np.random模块半酣许多可用于创建随机数组的函数,例如生成一个服从标准正态分布(均值为0、方差为1)的随机样本数组:
#一维数组
>>> np.random.randn(5)
array([ 0.80726684, -0.47856828, -1.01387413, -1.81198436, -0.30367494])
#多维数组
>>> np.random.randn(5,4)
array([[ 0.44795214, 0.58889219, 0.6557998 , -0.98750982],
[ 0.96874065, -0.83364282, 0.40935755, 0.17958365],
[-0.3830435 , -0.13996465, 0.65810287, -1.09443092],
[-1.67776307, 0.00275889, -1.32662109, 1.25585212],
[-0.66629589, -1.09667777, 1.08017396, 1.04579035]])
其它用法:
(1)numpy.random.rand(d0, d1, ..., dn)
生成一个(d0, d1, ..., dn)维的数组,数组的元素取自[0, 1)上的均分布,若没有参数输入,则生成一个数
#一个数
>>> np.random.rand()
0.5602091565863412
#多维数组
>>> np.random.rand(2,3)
array([[0.21425158, 0.55603564, 0.71230788],
[0.91407327, 0.12856442, 0.31680005]])
>>> np.random.rand(2,2,3)
array([[[0.66192283, 0.06463257, 0.49716463],
[0.90722766, 0.02891533, 0.97793578]],
[[0.30110233, 0.61075461, 0.85996915],
[0.62196878, 0.82921807, 0.12312781]]])
(2)numpy.random.randint(low, high=None, size=None, dtype='I')
生成size个整数,取值区间为[low, high),若没有输入参数high则取值区间为[0, low)
>>> np.random.randint(6) 4 >>> np.random.randint(6,size=2) array([1, 5]) >>> np.random.randint(6,size=2,dtype='int64') array([5, 0], dtype=int64)
(3)numpy.random.random(size=None)
产生[0.0, 1.0)之间的浮点数
>>> np.random.random()
0.45467454915616023
>>>
>>> np.random.random(6)
array([0.30329601, 0.59093303, 0.37975647, 0.23568354, 0.01647539,
0.46731369])
>>> np.random.random((6,3))
array([[8.65067985e-01, 6.32889091e-02, 8.97145125e-01],
[2.41960732e-01, 7.63990918e-01, 3.28925883e-01],
[7.77391602e-01, 2.94343398e-01, 2.47273732e-02],
[6.80504494e-01, 7.56751159e-01, 4.94071081e-04],
[5.18076628e-01, 1.17604372e-01, 3.18197217e-01],
[5.13292960e-01, 5.19054712e-01, 6.87742571e-01]])
-
np.arange
#创建一维数组
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#创建多维数组
>>> np.arange(10).reshape(2,5)
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
-
np.array
np.array(collection),collection为序列型对象(list),嵌套序列(list of list)
#创建一维数组
>>> np.array([1,2,3])
array([1, 2, 3])
>>> np.array(np.arange(1,4))
array([1, 2, 3])
#创建一个二维数组
>>> np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
>>> np.array([np.arange(1,4),np.arange(4,7)])
array([[1, 2, 3],
[4, 5, 6]])
#创建多维混合类型数组
>>> np.array([['a','b',1],[1,2,3]])
array([['a', 'b', '1'],
['1', '2', '3']], dtype='<U1')
3、数据类型
常用 NumPy 基本类型:
| bool_ | 布尔型数据类型(True 或者 False) |
| int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
| intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
| intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
| int8 | 字节(-128 to 127) |
| int16 | 整数(-32768 to 32767) |
| int32 | 整数(-2147483648 to 2147483647) |
| int64 | 整数(-9223372036854775808 to 9223372036854775807) |
| uint8 | 无符号整数(0 to 255) |
| uint16 | 无符号整数(0 to 65535) |
| uint32 | 无符号整数(0 to 4294967295) |
| uint64 | 无符号整数(0 to 18446744073709551615) |
| float_ | float64 类型的简写 |
| float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
| float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
| float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
| complex_ | complex128 类型的简写,即 128 位复数 |
| complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
| complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
数组类型使用dtype属性查看:
dtype,:类型名+位数,如float64、int32
>>> a = np.array([1,2,3])
>>> a.dtype
dtype('int32')
使用astype可转换数据类型:
>>> a = np.array([1,2,3])
>>> a.dtype
dtype('int32')
>>> b = a.astype(np.float64)
>>> b
array([1., 2., 3.])
>>> b.dtype
dtype('float64')
4、索引和切片
-
一维数组的索引和切片
一维数组的索引与Python的列表索引功能相似
>>> arr1 = np.array(np.arange(5)) >>> arr1 array([0, 1, 2, 3, 4]) >>> arr1[0] 0 >>> arr1[0:] array([0, 1, 2, 3, 4]) >>> arr1[0:2] array([0, 1]) >>> arr1[2:-1] array([2, 3])
-
多维数组的索引与切片
使用多维数组,仍然可以像一维数组一样使用切片,并且多维数组可以在不同的维度中混合匹配切片和耽搁索引。
以下面多维数组为例:
>>> arr2 = np.array([np.arange(1,4),np.arange(4,7),np.arange(7,10)])
>>> arr2
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
其中每个元素所处位置:
| 0,0 | 0,1 | 0,2 |
| 1,0 | 1,1 | 1,2 |
| 2,0 | 2,1 | 2,2 |
索引切片规则:
- arr[r1:r2, c1:c2]
- arr[1,1] 等价 arr[1][1]
- [:] 代表某个维度的数据
#取一个范围的数据
>>> arr2[1:3,1:3]
array([[5, 6],
[8, 9]])
#取某一个值
>>> arr2[1,1]
5
>>> arr2[1][1]
5
>>>
#取某一个维度的值
>>> arr2[:]
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
>>> arr2[1:]
array([[4, 5, 6],
[7, 8, 9]])
>>> arr2[:,1]
array([2, 5, 8])
>>>
另外在多维数组中还有条件索引,一般用于筛选多维数组:
#条件索引
# 找出 data_arr 中年龄大于等于5的数据
>>> data_array = np.random.rand(3,3)
>>> data_array
array([[0.41418315, 0.12959096, 0.53636403],
[0.23272318, 0.4801341 , 0.64412843],
[0.05275439, 0.01490136, 0.52569593]])
#过滤条件
>>> age_array = np.arange(1,10).reshape(3,3)
>>> age_array
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
#过滤得到的数据
>>> filter_array = data_array[age_array >= 5]
>>> filter_array
array([0.4801341 , 0.64412843, 0.05275439, 0.01490136, 0.52569593])
#多个过滤条件要使用 & |
>>> filter_array = data_array[(age_array >= 5) & (age_array %2 == 0)]
>>> filter_array
array([0.64412843, 0.01490136])
5、数组的运算
数组的运算是将相同大小的数组间的运算应用在元素上,注意这与线性代数中矢量运算是不同的。
##矢量与矢量的运算
>>> arr1 = np.arange(10).reshape(2,5)
>>> arr1
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> arr2 = np.arange(10,20).reshape(2,5)
>>> arr2
array([[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
#数组相加
>>> arr1+arr2
array([[10, 12, 14, 16, 18],
[20, 22, 24, 26, 28]])
>>
#数组相乘
>>> arr1*arr2
array([[ 0, 11, 24, 39, 56],
[ 75, 96, 119, 144, 171]])
>>>
##矢量与标量的运算
>>> 1/arr2
array([[0.1 , 0.09090909, 0.08333333, 0.07692308, 0.07142857],
[0.06666667, 0.0625 , 0.05882353, 0.05555556, 0.05263158]])
>>> 2*arr2
array([[20, 22, 24, 26, 28],
[30, 32, 34, 36, 38]])
>>>
数组间的运算包含矢量与矢量、矢量与标量,其运算的规则就是:
- 矢量运算,相同大小的数组键间的运算应用在元素上
- 矢量和标量运算,“广播”— 将标量“广播”到各个元素
(二)常用函数
1、元素级函数
- ceil, 向上最接近的整数
- floor, 向下最接近的整数
- rint, 四舍五入
- isnan, 判断元素是否为 NaN(Not a Number)
- multiply,元素相乘
- divide, 元素相除
>>> arr = np.random.randn(2,3)
>>> arr
array([[ 0.13900355, 1.0035698 , -1.18212763],
[ 0.61880961, 0.55586212, 0.56438219]])
#向上最接近的整数
>>> np.ceil(arr)
array([[ 1., 2., -1.],
[ 1., 1., 1.]])
#向下最接近的整数
>>> np.floor(arr)
array([[ 0., 1., -2.],
[ 0., 0., 0.]])
#四舍五入
>>> np.rint(arr)
array([[ 0., 1., -1.],
[ 1., 1., 1.]])
#判断元素是否为 NaN(Not a Number)
>>> np.isnan(arr)
array([[False, False, False],
[False, False, False]])
>>>
#数组相乘
>>> arr1 = np.random.randn(2,3)
>>> arr1
array([[-0.04220886, 0.86937388, -2.46986511],
[ 1.33986535, -0.70081799, 0.571598 ]])
>>> arr2 = np.multiply(arr,arr1)
>>> arr2
array([[-0.00586718, 0.87247737, 2.91969579],
[ 0.82912156, -0.38955817, 0.32259973]])
#数组相除
>>> arr3 = np.divide(arr,arr1)
>>> arr3
array([[-3.29323126, 1.15435928, 0.47862032],
[ 0.46184462, -0.79316188, 0.98737608]])
>>>
2、统计函数
- np.mean(x [, axis]): 所有元素的平均值,参数是 number 或 ndarray
- np.sum(x [, axis]): 所有元素的和,参数是 number 或 ndarray
- np.max(x [, axis]): 所有元素的最大值,参数是 number 或 ndarray
- np.min(x [, axis]): 所有元素的最小值,参数是 number 或 ndarray
- np.std(x [, axis]): 所有元素的标准差,参数是 number 或 ndarray
- np.var(x [, axis]): 所有元素的方差,参数是 number 或 ndarray
- np.argmax(x [, axis]): 最大值的下标索引值,参数是 number 或 ndarray
- np.argmin(x [, axis]): 最小值的下标索引值,参数是 number 或 ndarray
- np.cumsum(x [, axis]): 返回一个同纬度数组,每个元素都是之前所有元素的 累加和,参数是 number 或 ndarray
- np.cumprod(x [, axis]): 返回一个同纬度数组,每个元素都是之前所有元素的 累乘积,参数是 number 或 ndarray
注意多维的数组要指定统计的维度,否则默认是全部维度上统计。
>>> arr = np.arange(12).reshape(4,3)
>>> arr
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
>>> np.sum(arr)
66
>>> np.sum(arr,axis=1)
array([ 3, 12, 21, 30])
>>>
3、条件函数
- all(iterables):如果可迭代对象iterables中所有元素为True则返回True。
- any(iterables):如果可迭代对象iterables中任意存在每一个元素为True则返回True。
- unique(iterables):从可迭代对象iterables中找到唯一值(去重)并返回排序结果
>>> arr =np.array([[1,2],[2,4]])
>>> arr
array([[1, 2],
[2, 4]])
>>> np.all(arr)
True
>>> np.any(arr)
True
>>> np.unique(arr)
array([1, 2, 4])
>>>
4、文件存储函数
当进行数组操作后需要将数组的内容进行保存,此时需要用到文件存储的函数。
- savetxt
- loadtxt
import numpy as np
array = np.arange(20)
#将数组array以整数形式保存到a.txt文件中
np.savetxt("a.txt",array,fmt='%d')
#将数组array以浮点数形式保存到b.txt文件中
np.savetxt("b.txt",array,fmt='%.2f')
#从a.txt文件中以整数形式读取文本数据,并返回NumPy数组
array1 = np.loadtxt("a.txt",dtype='int')
print(array1)
#从b.txt文件中以浮点数形式读取文本数据,并返回NumPy数组
array2 = np.loadtxt("b.txt",dtype='float')
print(array2)
savetxt和loadtxt函数也是可以读写CSV文件,CSV文件是用分隔符分隔的文本文件,通常的分隔符包括空格、逗号、分号等;通过loadtxt函数可以读取CSV文件,通过savetxt函数可以将数组保存为CSV文件。
savetxt和loadtxt函数默认都是使用空白符(空格、制表符等)作为分隔符,但可以通过delimiter关键字参数指定分隔符,还可以通过usecols关键字参数将读取的数据拆分成多列返回,列索引从0开始。
import numpy as np
array = np.arange(12).reshape(3,4)
print(array)
#将二维数组保存到c.txt文件中,并用逗号分隔
np.savetxt("c.txt",array,fmt="%d",delimiter=',')
#从c.txt文件以整数类型读取文本,并且获取第1,3列的数据
array3 = np.loadtxt("c.txt",dtype=int,delimiter=",",usecols=(0,2))
print(array3)
#将上述获取的第1,3列数据赋值给x,y变量,必须将unpack=True
x,y = np.loadtxt("c.txt",dtype=int,delimiter=",",usecols=(0,2),unpack=True)
print(x,y)
参考: