Numpy是一个开源的python科学计算库
拥有一个强大的N维数组对象ndarray
广播功能函数
具有线性代数、傅里叶变换、随机数生成等功能
Numpy是Scipy、pandas等数据处理与科学计算库的基础
Pandas数据操作库建立在NumPy之上,但它使用了另外两种基本数据结构而不是数组:Series和DataFrames,
SciPy以Numpy为基础,提供大量可在NumPy矩阵上运行的函数
机器学习库Scikit-Learn不仅可以在NumPy上构建,还可以在SciPy和Matplotlib上构建。
ndarray是一个多维数组对象,由两部分组成:
ndarray的一个别名是array
import numpy as np
#插入numpy库
Note:
Numpy数组与python列表不一样!!
a = np.array([1,2,3])
#还可以通过列表或者元组创建ndarray数组对象,np.array(list/turple,dtype=np.float32)
#一维数组
b = np.array([(1.5,2,3),(4,5,6)],dtype=float)
#二维数组
c = np.array([(1.5,2,3),(4,5,6)],[(3,2,1),(4,5,6)],dtype=float)
#创建2*2*1的3D数组,数组元素类型为float
np.zeros((3,4))
#创建零数组
np.ones((2,3,4),dtype=np.int16)
#创建一数组
d = np.arange(10,25,5)
#类似于range()函数
#结果:(10,15,20)
np.linspace(0,2,9)
结果
生成array对象:
.linspace()函数还有一个参数endpoint,若其为False则最后一个元素不计入数组
np.concatenate((a,b))
#将两个向量合成一个向量
np.full((2,3),4)
#创建2*3的数组元素全为4的矩阵
np.eye(5)
#创建5维单位矩阵
np.random.random((2,3))
#创建2*3的随机数矩阵
np.empty((4,3))
#创建4*3的空矩阵
>>> np.save("a.npy", a)
>>> c = np.load( "a.npy" )
>>> c
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
np.savez('array.npz', a, b)
#保留多个数组在同一个文件中
savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象
>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.arange(0, 1.0, 0.1)
>>> c = np.sin(b)
>>> np.savez("result.npz", a, b, sin_array = c)
>>> r = np.load("result.npz")
>>> r["arr_0"] # 数组a
array([[1, 2, 3],
[4, 5, 6]])
>>> r["arr_1"] # 数组b
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
>>> r["sin_array"] # 数组c
array([ 0. , 0.09983342, 0.19866933, 0.29552021, 0.38941834,
0.47942554, 0.56464247, 0.64421769, 0.71735609, 0.78332691])
读取保存CSV文件:
何为csv文件:CSV(comma-separated value 逗号分隔值)
csv是一种文件存储格式,用来存储批量数据
np.savetxt(frame, array, fmt="%.18e", delimiter = None)
#保存为文件
frame: 文件、字符串或产生器,可以是.gz或.bz2的压缩文件
array: 存入文件的数组
fmt: 写入文件的格式
delimiter: 分割字符串,默认是空格
eg:
a = np.arange(100).reshape(2,50)
np.savetxt('a.csv', a, fmt = '%d', delimiter = ',')
np.loadtxt(frame, dtype = np.float, delimiter = None, unpack = False)
#读取文件,并将文件数据保存为ndarray数组对象
unpack: 若其值为True,读入的属性将写入不同的变量
CSV文件的局限性: 只能存储读取一维或者二维数组
用Numpy存取多维数组
a.tofile(frame, seq = ' ', format = '%s')
#把a数组保存为文件
frame: 文件、字符串
seq: 数据分割字符串,如果是空串,写入文件为二进制
format: 写入数据的格式
eg:
a = np.arange(100),reshape(2,50)
a.tofile('b.bat', seq = ',', format = '%d')
np.fromfile(frame, dtype = float, count = -1, seq = '')
#从文件中读取数组
count: 读入元素的个数,若为-1则读取整个文件
seq: 数据分割字符串,如果是空串,写入文件为二进制
Notes:
使用该方法需要知道存入数组时的维度和元素类型
>>> np.int64 有符号的64位整型
>>> np.int16 有符号的16位整型
>>> np.float 单精度类型
>>> np.float32 双精度浮点型
>>> np.complex 用128位浮点数表示的复数类型
>>> np.bool 布尔型
>>> np.object Python对象类型
>>> np.string_ 固定长度的字符串类型
>>> np.unicode_ 固定长度的unicode类型
>>> a = np.eye(5)
>>>a.ndim #显示数组(矩阵)的秩(准确的说是轴的数量或者维度的数量)
>2
>>> a.shape #查看数组维数
>(5,5)
>>> len(a) #查看数组长度
>5
>>> a.size #数组元素总数
>25
>>> a.dtype #数组元素数据类型
>dtype('float64')
>>> a.dtype.name
>'float64'
>>> a.astype(int) #类型转换 一定会创建一个新的数组
np.random的随机数函数
Tips: 数组与标量的运算会应用到数组上的每一个元素。
>>> a = np.zeros((2,3))
>>> b = np.array([(0.5,0,0),(3,3,3)])
>>> g = a - b #数组减法
>array([[-0.5, 0. , 0. ],
[-3. , -3. , -3. ]])
>>> np.subtract(a,b)
>array([[-0.5, 0. , 0. ],
[-3. , -3. , -3. ]])
>>> b + a #数组加法
>array([[0.5, 0. , 0. ],
[3. , 3. , 3. ]])
>>> np.add(b,a)
>array([[0.5, 0. , 0. ],
[3. , 3. , 3. ]])
>>> a = np.ones((2,3))
>>> b = np.full((2,3),2)
>>> a / b #数组除法(对应数组元素相除)
>array([[0.5, 0.5, 0.5],
[0.5, 0.5, 0.5]])
>>> np.divide(a,b)
>array([[0.5, 0.5, 0.5],
[0.5, 0.5, 0.5]])
>>> a=np.array([(1,2,3),(4,5,6)])
>>> b=np.array([(3,2,1),(6,5,4)])
>>> a * b #数组乘法(对应元素的乘法)
>array([[ 3, 4, 3],
[24, 25, 24]])
>>> np.multiply(a,b)
>>> np.exp(b) #e的幂,指数为b的数组元素
>>> np.sqrt(b) #取b数组元素的平方根
>>> np.square(b) #计算数组每个元素的平方
>>> np.sin(a)
>>> np.cos(b)
>>> np.log(a) #每个元素的自然对数,.log2()和.log10()分别表示2为底对数和10为底对数
矩阵乘法
>>> c
array([1, 2, 3])
>>> d
array([2, 3, 4])
>>> np.dot(c,d)
20
>>> a == b #每个对应的数组元素判断是否相等
>array([[False, True, False],
[False, True, False]])
>>> a < 2 #判断数组中是否每个元素都小于2
>array([[ True, False, False],
[False, False, False]])
>>> np.array_equal(a, b)
>False
>>> a.sum()
>>> a.min()
>>> b=np.array([(3,2,1),(1,4,0.5),(1,3,4),(0,0,100)])
> b
array([[ 3. , 2. , 1. ],
[ 1. , 4. , 0.5],
[ 1. , 3. , 4. ],
[ 0. , 0. , 100. ]])
>>> b.max(axis=0)#axis=0表示求每一列中的最大值,axis=1表示求每一行中的最大值
> array([ 3., 4., 100.])
>>> b.max(axis=1)
> array([ 3., 4., 4., 100.])
>>> b.cumsum(axis=1) #对每一行的数组元素进行累加
>array([[ 3. , 5. , 6. ],
[ 1. , 5. , 5.5],
[ 1. , 4. , 8. ],
[ 0. , 0. , 100. ]])
>>> a.mean() #所有元素均值
>>> b.median() #中位数
>>> a.corrcoef() #相关系数
>>> np.std(b) #标准差
>>> h = a.view() #创建数组视图
>>> np.copy(a) #复制一个array对象
>>> h = a.copy()
>b
array([[ 3. , 2. , 1. ],
[ 1. , 4. , 0.5],
[ 1. , 3. , 4. ],
[ 0. , 0. , 100. ]])
>>> b.sort() #数组排序(默认按行排序)
>array([[ 1. , 2. , 3. ],
[ 0.5, 1. , 4. ],
[ 1. , 3. , 4. ],
[ 0. , 0. , 100. ]])
>>> b.sort(axis=0) #按列排序
起始编号:终止编号(不含):步长
>a
>array([[1, 2, 3],
[4, 5, 6]])
>b
>array([[ 0. , 0. , 3. ],
[ 0.5, 1. , 4. ],
[ 1. , 2. , 4. ],
[ 1. , 3. , 100. ]])
子集Subsetting
>>> a[1] #选中数组a第2行所有元素
>>> b[1,2] #选中b数组第2行第3列的元素4.0(等价于b[1][2])
切片Slicing
>>> b[0:2] #选中b数组第0行到第1行的所有元素
>array([[0. , 0. , 3. ],
[0.5, 1. , 4. ]])
>>> b[0:2,2] #在第2列中选中第0行到第1行的元素
>array([3., 4.])
>>> b[:3] #选中0,1,2行所有元素 等价于b[0:1,:]
>array([[0. , 0. , 3. ],
[0.5, 1. , 4. ],
[1. , 2. , 4. ]])
>>> b[2,...] #选中第2行所有元素,等价于b[1,:,:]
>array([1., 2., 4.])
>>> b[::-1]#反转数组
布尔索引Boolean Indexing
>>> a[a>2] #选择a数组中所有比2大的数组元素组成向量
>array([3, 4, 5, 6])
花式索引Fancy Indexing
>>> b
>array([[ 0. , 0. , 3. ],
[ 0.5, 1. , 4. ],
[ 1. , 2. , 4. ],
[ 1. , 3. , 100. ]])
>>> b[[1, 0, 1, 0],[0, 1, 2, 0]] #选中元素 (1,0),(0,1),(1,2) 和 (0,0)
>array([0.5, 0. , 4. , 0. ])
ls = a.tolist()
#把ndarray对象a转换为列表
>>>b
>array([[ 0. , 0. , 3. ],
[ 0.5, 1. , 4. ],
[ 1. , 2. , 4. ],
[ 1. , 3. , 100. ]])
转置矩阵Transposing Array
>>> np.transpose(b)
>>> b.T
>array([[ 0. , 0.5, 1. , 1. ],
[ 0. , 1. , 2. , 3. ],
[ 3. , 4. , 4. , 100. ]])
改变矩阵型Changing Array Shape
>>> b.ravel() #展平矩阵,使其变为一个向量
>array([ 0. , 0. , 3. , 0.5, 1. , 4. , 1. , 2. , 4. ,
1. , 3. , 100. ])
>>> b.reshape(3,-2) #重塑矩阵,但不改变矩阵数据,.resize会改变原数组
>array([[ 0. , 0. , 3. , 0.5],
[ 1. , 4. , 1. , 2. ],
[ 4. , 1. , 3. , 100. ]])
增删矩阵元素 Adding/Removing Elements
>>> r = np.arange(20)
>array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
>>> r.resize((4,5))
>array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
>>>a
> array([[1, 2, 3],
[4, 5, 6]])
>>> np.append(r,b)
> array([ 0. , 1. , 2. , 3. , 4. , 5. , 6. , 7. , 8. ,
9. , 10. , 11. , 12. , 13. , 14. , 15. , 16. , 17. ,
18. , 19. , 0. , 0. , 3. , 0.5, 1. , 4. , 1. ,
2. , 4. , 1. , 3. , 100. ])
>>> np.insert(a, 1, 5) #在a矩阵的第1个元素位置插入5,并把a矩阵变为向量
>array([1, 5, 2, 3, 4, 5, 6])
>>> np.insert(a, (0,1), 5) #在a矩阵的第1个元素和第0个元素位置插入5,并把a矩阵变为向量
>array([5, 1, 5, 2, 3, 4, 5, 6])
>>> np.delete(a,[1]) #删除元素
>array([1, 3, 4, 5, 6])
Combining Arrays
>>> np.concatenate((r,b),axis=1) #按行串接矩阵,两矩阵行数必须相同,Note:axis=0是按列串接两矩阵,此时两矩阵列数一定要相同,否则出现ValueError
>array([[ 0. , 1. , 2. , 3. , 4. , 0. , 0. , 3. ],
[ 5. , 6. , 7. , 8. , 9. , 0.5, 1. , 4. ],
[ 10. , 11. , 12. , 13. , 14. , 1. , 2. , 4. ],
[ 15. , 16. , 17. , 18. , 19. , 1. , 3. , 100. ]])
>>> np.vstack((a,b)) #垂直串接矩阵,矩阵列数一定要相同!!!
>array([[ 1. , 2. , 3. ],
[ 4. , 5. , 6. ],
[ 0. , 0. , 3. ],
[ 0.5, 1. , 4. ],
[ 1. , 2. , 4. ],
[ 1. , 3. , 100. ]])
>>> np.r_[a, b] #垂直串接矩阵,矩阵列数一定要相同!!!(结果同上)
>>> np.hstack((e,f)) #水平串接矩阵,矩阵行数一定要相同!!!
>array([[ 0. , 1. , 2. , 3. , 4. , 0. , 0. , 3. ],
[ 5. , 6. , 7. , 8. , 9. , 0.5, 1. , 4. ],
[ 10. , 11. , 12. , 13. , 14. , 1. , 2. , 4. ],
[ 15. , 16. , 17. , 18. , 19. , 1. , 3. , 100. ]])
>>> np.column_stack((a,d)) #水平串接矩阵(结果同上)
>>> np.c_[a,d] (结果同上)
分裂矩阵Splitting Arrays
>>> a
>array([[1, 2, 3],
[4, 5, 6]])
>>> np.hsplit(a,3) #将a划分为三个列向量
>array([[1],[4]]),
array([[2],[5]]),
array([[3],[6]])]
>>> np.vsplit(b,4) #将b划分为四个行向量
>[array([[0., 0., 3.]]), array([[0.5, 1. , 4. ]]), array([[1., 2., 4.]]), array([[ 1., 3., 100.]])]
图像的数组表示:
图像一般使用RGB色彩模式,即每个像素点由红、绿、蓝表示,是一个由像素组成的二维矩阵,每个元素是一个RGB值
R:范围0~255
G:范围0~255
B:范围0~255
PIL库:用于图像处理的第三方库
from PIL import Image
#image是PIL中一个代表图像的类
import numpy as np
im = np.array(Image.open("C:/Users/22905/Desktop/heyi.png"))
print(im.shape, im.dtype)
#图像是一个三位数组,维度分别为高度,宽度,像素的RGB值
#图像变换
b = [255,255,255]-a
#将作用与a中每一个像素的RGB值
im_1 = Image.fromarray(b.astype('unint8'))
#利用Image对象的fromarray方法把数组b转换为一个Image对象im_0
im_1.save("C:/Users/22905/Desktop/heyi_2.png")
#convert('L')方法可以把图像转换成灰度图
NumPy Cheat Sheet: Data Analysis in Python
The Data Scientist’s Toolbox Tutorial - 2
www.numpy.org
Python数据分析与展示