NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵。
1、引入numpy模块
>>> import numpy as np
2、Ndarray对象(NumPy库的基础)
>>> l = [1, 2, 3]
>>> a = np.array(l) #数字 -列表转化为矩阵
# 查看a对象的数据类型
>>> type(a)
numpy.ndarray
# 数据类型(查看a里边的数据类型)
>>> a.dtype
dtype('int32')
# 轴数量 ---维度,几维数组
>>> a.ndim
1
# 数组长度 ---元素个数
>>> a.size
3
# 数组的型 ---行数和列数
>>> a.shape
(3,)
3、定义二维数组
>>> b = np.array([[1.3, 2.4], [0.3, 4.1]])
>>> b.dtype
dtype('float64')
>>> b.ndim
2
>>> b.size
4
>>> b.shape
(2, 2)
4、创建数组
>>> c = np.array([[1, 2, 3], [4, 5, 6]])
array([[1, 2, 3],
[4, 5, 6]])
>>> d = np.array(((1, 2, 3), (4, 5, 6)))
array([[1, 2, 3],
[4, 5, 6]])
>>> e = np.array([(1, 2, 3), [4, 5, 6], (7, 8, 9)])
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
5、数据类型判断
>>> g = np.array([['a', 'b'], ['c', 'd']])
>>> g
array([['a', 'b'],
['c', 'd']],
dtype='>> g.dtype
dtype('>> g.dtype.name
'str32'
>>> f = np.array([[1, 2, 3], [4, 5, 6]], dtype=complex)
>>> f
array([[ 1.+0.j, 2.+0.j, 3.+0.j],
[ 4.+0.j, 5.+0.j, 6.+0.j]])
>>> f.astype('float') #astype转换类型
array([[ 1., 2., 3.],
[ 4., 5., 6.]])
6、创建自定义数组
>>> np.zeros((3, 3)) # 建立一个零矩阵
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.ones((3, 3)) # 建立一个单位阵
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.]])
>>> np.eye(3) #创建单位阵I(对角线上为1,其余位置为0)
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> np.empty(3) #只分配内存空间,但不填充任何值(填充值比较随机),创建数据接近0
array([ 1., 1., 1.])
>>> np. empty((2, 3))
array([[ 0., 0., 0.],
[ 0., 0., 0.]])
>>> np.arange(0, 10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(4, 10)
array([4, 5, 6, 7, 8, 9])
>>> np.arange(0, 12, 3)
array([0, 3, 6, 9])
>>> np.arange(0, 6, 0.6) #前闭后开
array([ 0. , 0.6, 1.2, 1.8, 2.4, 3. , 3.6, 4.2, 4.8, 5.4])
>>> np.arange(0, 12).reshape(3, 4)#3x4矩阵
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> np.linspace(0, 10, 5) #linspace()与arange()非常相似,不同:第三个参数指定分成几个部分,左闭右闭,均分。
array([ 0. , 2.5, 5. , 7.5, 10. ])
>>> np.linspace(0, 10, 12).reshape(4, 3)
array([[ 0. , 0.90909091, 1.81818182],
[ 2.72727273, 3.63636364, 4.54545455],
[ 5.45454545, 6.36363636, 7.27272727],
[ 8.18181818, 9.09090909, 10. ]])
>>> np.random.random(3) #随机数[0.0, 1.0)
array([ 0.94909317, 0.71750078, 0.41642637])
>>> np.random.random((3, 3))
array([[ 0.71603364, 0.55855257, 0.03496732],
[ 0.77959685, 0.3598885 , 0.61941165],
[ 0.531754 , 0.15758114, 0.57497902]])
from numpy import random as np_random
>>> np.random.randint(1, 10, size=3)#起始位置,结束位置,元素个数;左闭右开;当size给定的是tuple,就是矩阵的shape
array([4, 3, 9])
数组的基本操作
1、算数运算
In [11]:x=np.arange(0,5)
In [12]:y=np.arange(5,10)
In [13]:x+y
Out[13]:array([ 5, 7, 9, 11, 13])
In [14]:x-y
Out[14]:array([-5, -5, -5, -5, -5])
In [15]:x*y
Out[15]:array([ 0, 6, 14, 24, 36])
#数组a乘以数组b的平方根
In [16]:x * np.sqrt(y)
Out[16]:array([ 0. , 2.44948974, 5.29150262, 8.48528137, 12. ])
2、矩阵积
In [22]: a = np.arange(12).reshape(4, 3)
In [23]: a
Out[23]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [24]: b = np.arange(12).reshape(3, 4)
In [25]: b
Out[25]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [26]: np.dot(a,b)
Out[26]:
array([[ 20, 23, 26, 29],
[ 56, 68, 80, 92],
[ 92, 113, 134, 155],
[128, 158, 188, 218]])
In [27]: a.dot(b)
Out[27]:
array([[ 20, 23, 26, 29],
[ 56, 68, 80, 92],
[ 92, 113, 134, 155],
[128, 158, 188, 218]])
#np.dot(b, a) != np.dot(a, b)
In [29]: np.dot(b, a)
Out[29]:
array([[ 42, 48, 54],
[114, 136, 158],
[186, 224, 262]])
3、自增、自减操作
In [30]: a = np.arange(2,4)
In [31]: a++
File "", line 1
a++
^
SyntaxError: invalid syntax
#python没有++或--运算符,对变量的值进行自增或自减,需要使用+=或-=运算符
In [32]: a--
File "", line 1
a--
^
SyntaxError: invalid syntax
4、聚合函数
概念:指对一组值(比如一个数组)进行操作,返回一个单一值作为结果的函数。
#创建一维数组
In [35]: a = np.array([2, 4, 5, 7, 8])
In [36]: a
Out[36]: array([2, 4, 5, 7, 8])
#求和
In [38]: a.sum()
Out[38]: 26
#算术平均数
In [39]: a.mean()
Out[39]: 5.2000000000000002
#标准差
In [41]: a.std()
Out[41]: 2.1354156504062622
#方差
In [42]: a.var()
Out[42]: 4.5600000000000005
#最小值
In [43]: a.min()
Out[43]: 2
#最大值
In [44]: a.max()
Out[44]: 8
#最小值索引
In [45]: a.argmin()
Out[45]: 0
#最大值索引
In [46]: a.argmax()
Out[46]: 4
#所有元素累积和
In [47]: a.cumsum()
Out[47]: array([ 2, 6, 11, 18, 26], dtype=int32)
#所有元素累计积
In [48]: a.cumprod()
Out[48]: array([ 2, 8, 40, 280, 2240], dtype=int32)
5、矩阵转置
In [49]: x = np.arange(0,12).reshape((4,3))
In [50]: x
Out[50]:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
In [51]: x.T
Out[51]:
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])
6、几个函数的介绍
#clip(Array, Array_min, Array_max):
#判断是否有比最小值小的或者比最大值大的元素,并将这些指定的元素转换为最小值或者最大值
In [52]: x = np.arange(0,24,2).reshape((4,3))
In [53]: x
Out[53]:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16],
[18, 20, 22]])
In [54]: np.clip(x,5,15)
Out[54]:
array([[ 5, 5, 5],
[ 6, 8, 10],
[12, 14, 15],
[15, 15, 15]])
#diff:(累差运算函数)每一行中后一项与前一项之差
In [55]: np.diff(x,axis=1)
Out[55]:
array([[2, 2],
[2, 2],
[2, 2],
[2, 2]])
In [56]: np.diff(x,axis=0)
Out[56]:
array([[6, 6, 6],
[6, 6, 6],
[6, 6, 6]])
#将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵
In [58]: np.nonzero(x)
Out[58]:
(array([0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3], dtype=int64),
array([1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2], dtype=int64))
7、指定行、列操作
#axis应用
In [60]: a=np.arange(0,24,2).reshape(4,3)
In [61]: a
Out[61]:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16],
[18, 20, 22]])
#横坐标为第1,2行,纵坐标为第0列
In [62]: a[[1,2],:1]
Out[62]:
array([[ 6],
[12]])
#横坐标为第1,2行,纵坐标为第0,1,2列
In [63]: a[[1,2],:3]
Out[63]:
array([[ 6, 8, 10],
[12, 14, 16]])
#横坐标为第0,1,2行,纵坐标为第0,1,2列
In [64]: a[:3,:3]
Out[64]:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
#横坐标为第2行,纵坐标为第0,1,2列
In [65]: a[2][:3]
Out[65]: array([12, 14, 16])
#横坐标为第2行,纵坐标为0,1列
In [66]: a[2][:2]
Out[66]: array([12, 14])
#横坐标为第0,1行,纵坐标为0,1,2列
In [67]: a[:2][:2]
Out[67]:
array([[ 0, 2, 4],
[ 6, 8, 10]])
numpy高级语法
1、numpy索引机制
"""
#一维数组
In [123]: a = np.arange(0, 6)
In [124]: a
Out[124]: array([0, 1, 2, 3, 4, 5])
In [125]: a[4]
Out[125]: 4
In [126]: a[-1]
Out[126]: 5
In [127]: a[[1,3,4]]
Out[127]: array([1, 3, 4])
#二维数组
In [128]: A = np.arange(1, 13).reshape((3,4))
In [129]: A
Out[129]:
array([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
In [130]: A[1,2]
Out[130]: 7
In [131]: A[0,:]
Out[131]: array([1, 2, 3, 4])
"""
#高维矩阵
In [132]: arr = np.arange(16).reshape((2, 2, 4))
In [133]: arr
Out[133]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
"""
2、花式索引
利用整数数组进行索引
In [134]: arr = np.arange(24).reshape((4, 6))
In [135]: arr
Out[135]:
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]])
"""
# 打印arr[1, 0]、arr[3, 3],arr[2, 1]和arr[2, 2]
In [137]: arr[[1, 3,2, 2], [0, 3, 1, 2]]
Out[137]: array([ 6, 21, 13, 14])
#几种常见的写法:
arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]] # 1572行的0312列
arr[[1, 5, 7, 2], :][:, [0, 3, 1, 2]]
arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]
# 可读性更好的写法
In [138]: arr[np.ix_([1, 3,2, 2], [0, 3, 1, 2])]
Out[138]:
array([[ 6, 9, 7, 8],
[18, 21, 19, 20],
[12, 15, 13, 14],
[12, 15, 13, 14]])
#切片操作(对Python列表进行切片操作得到的数组是原数组的副本,而对NumPy数组进行切片操作得到的数组则是指向相同缓冲区的视图)
#--------------------一维数组的切片-----------------------
In [140]: a = np.arange(4, 16)
In [141]: a
Out[141]: array([ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
In [142]: a[1:4]
Out[142]: array([5, 6, 7])
In [143]: a[1:8:2]
Out[143]: array([ 5, 7, 9, 11])
In [144]: a[::2]
Out[144]: array([ 4, 6, 8, 10, 12, 14])
In [145]: a[:5:2]
Out[145]: array([4, 6, 8])
In [146]: a[:5:]
Out[146]: array([4, 5, 6, 7, 8])
#-----------二维数组的切片------------------------
In [147]: A = np.arange(10, 19).reshape(3, 3)
In [148]: A
Out[148]:
array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
#
In [149]: A[0,:]
Out[149]: array([10, 11, 12])
#-------------只选取第0行-----------------------------
In [150]: A[0:]
Out[150]:
array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
#-------------只选取第0列-----------------------------
In [151]: A[:,0]
Out[151]: array([10, 13, 16])
#-------------选取第0至2行;第0至1行---------------------
In [152]: A[0:2,0:1]
Out[152]:
array([[10],
[13]])
#--------#抽取的行或列的索引不连续,可以把这几个索引放到数组中-----------
In [153]: A[[0,1],0:2]
Out[153]:
array([[10, 11],
[13, 14]])
#---------------将多维的矩阵进行展开成1行的数列-------------
In [159]: A
Out[159]:
array([[ 3, 4, 5, 6],
[ 7, 8, 9, 10],
[11, 12, 13, 14]])
In [160]: A.flatten()
Out[160]: array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
In [161]: A.ravel()
Out[161]: array([ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
"""
2、条件和布尔数组
"""
In [163]: A = np.arange(3,15).reshape((3,4))
In [164]: A>10
Out[164]:
array([[False, False, False, False],
[False, False, False, False],
[ True, True, True, True]], dtype=bool)
In [165]: A[A>10]
Out[165]: array([11, 12, 13, 14])
#-------------------------any和all--------------------
In [166]: bool=A>10
In [167]: bool
Out[167]:
array([[False, False, False, False],
[False, False, False, False],
[ True, True, True, True]], dtype=bool)
In [168]: bool.any
Out[168]:
In [169]: bool.any()# 有一个为True则返回True(或)
Out[169]: True
In [170]: bool.all()#有一个为False则返回False(且)
Out[170]: False
"""
3、排序
#--------------sort等价于 arr.sort()默认以快速排序方式进行排序-------
In [177]: arr = np.random.randn(5, 3)
In [178]: arr
Out[178]:
array([[-1.80098342, 0.61670456, -0.25107411],
[-0.36931902, -2.2561787 , 0.10049678],
[-0.91459371, 0.1001589 , 0.10713487],
[ 0.62432412, -0.16241655, 0.07999333],
[ 1.48142467, 0.57865028, 1.75677415]])
#--------------- 对每一行元素做排序---------
In [179]: arr.sort(axis=1)
In [180]: arr
Out[180]:
array([[-1.80098342, -0.25107411, 0.61670456],
[-2.2561787 , -0.36931902, 0.10049678],
[-0.91459371, 0.1001589 , 0.10713487],
[-0.16241655, 0.07999333, 0.62432412],
[ 0.57865028, 1.48142467, 1.75677415]])
#-------------#针对列升序---------------------
In [181]: arr.sort(axis=0)
In [182]: arr
Out[182]:
array([[-2.2561787 , -0.36931902, 0.10049678],
[-1.80098342, -0.25107411, 0.10713487],
[-0.91459371, 0.07999333, 0.61670456],
[-0.16241655, 0.1001589 , 0.62432412],
[ 0.57865028, 1.48142467, 1.75677415]])
4、形状变换
In [194]: a = np.random.random(6)
#------------reshape()函数把一维数组转换为矩阵-----------
In [195]: b=a.reshape(2,3)
In [196]: b
Out[196]:
array([[ 0.21731265, 0.53810631, 0.44837452],
[ 0.38224738, 0.4782008 , 0.05974065]])
#-----------改变数组形状的操作是可逆的,ravel()-----------
In [198]: c = a.ravel()
In [199]: c #-------把二维再变回一维数组------
Out[199]:
array([ 0.21731265, 0.53810631, 0.44837452, 0.38224738, 0.4782008 ,
0.05974065])
#-------------------一维array的转置----np.newaxis--------
#一维array的转置
In [202]: A = np.array([1,1,1])
In [202]: [np.newaxis,:].shape
In [203]: A[np.newaxis,:].shape
Out[203]: (1, 3)
In [204]: A[:,np.newaxis].shape
Out[204]: (3, 1)
#-----------数组操作-------------------------
In [205]: A = np.ones((3, 3))
In [206]: B = np.zeros((3, 3))
#---垂直入栈:可用于多个数组之间的连接,在tuple中输入多个数组即可----
In [207]: np.vstack((A, B))
Out[207]:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
## 水平入栈 ----水平拼接
In [208]: np.hstack((A, B))
Out[208]:
array([[ 1., 1., 1., 0., 0., 0.],
[ 1., 1., 1., 0., 0., 0.],
[ 1., 1., 1., 0., 0., 0.]])
#---------np.column_stack((A,B))==np.hstack((A, B))-----
In [209]: np.column_stack((A,B))
Out[209]:
array([[ 1., 1., 1., 0., 0., 0.],
[ 1., 1., 1., 0., 0., 0.],
[ 1., 1., 1., 0., 0., 0.]])
#---------np.row_stack((A,B))==np.vstack((A, B))-----
In [210]: np.row_stack((A,B))
Out[210]:
array([[ 1., 1., 1.],
[ 1., 1., 1.],
[ 1., 1., 1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
#-----------------数组拼接----------------------------
In [211]: arr1 = np.array([[1, 2, 3], [4, 5, 6]])
...: arr2 = np.array([[7, 8, 9], [10, 11, 12]])
...:
In [213]: np.concatenate([arr1, arr2], axis = 0) # 按行连接
Out[213]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
In [214]: np.concatenate([arr1, arr2], axis = 1) # 按列连接
Out[214]:
array([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])
In [215]: np.concatenate([arr1, arr2], axis = 0) # 按行连接
Out[215]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
In [216]: np.concatenate([arr1, arr2], axis = 1) # 按列连接
Out[216]:
array([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])
In [217]: np.r_[arr1, arr2] # 按行拼接
Out[217]:
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
In [218]: np.c_[arr1, arr2] # 按列拼接
Out[218]:
array([[ 1, 2, 3, 7, 8, 9],
[ 4, 5, 6, 10, 11, 12]])
#-----------------数组不对称切分---------
# ------均分方法一
A = np.arange(16).reshape((4, 4))
In [219]: A = np.arange(16).reshape((4, 4))
In [220]: np.hsplit(A, 2) #竖分 ---对称:被切割的分数,只能是被整除
Out[220]:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
In [221]: np.vsplit(A, 2) #横分
Out[221]:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
In [222]: np.split(A, 2)
Out[222]:
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])]
In [223]: np.split(A, 2, axis=1)
Out[223]:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
#---------------数组不对称切分---------------------
#-----法1:第二个参数代表下标,在那些下标之前进行切---
In [224]: np.split(A, [1, 3], axis = 1)
Out[224]:
[array([[ 0],
[ 4],
[ 8],
[12]]), array([[ 1, 2],
[ 5, 6],
[ 9, 10],
[13, 14]]), array([[ 3],
[ 7],
[11],
[15]])]
In [225]: np.split(A, [1, 3], axis = 0)
Out[225]:
[array([[0, 1, 2, 3]]), array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]])]
#-----------np.array_split() :第2个参数是份数,前面多,后面少----
In [227]: np.array_split(A, 3, axis=1)
Out[227]:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2],
[ 6],
[10],
[14]]), array([[ 3],
[ 7],
[11],
[15]])]
5、集合操作
"""
In [236]: a=np.array([3, 3, 3, 2, 2, 1, 1, 4, 4])
In [237]: b=np.array([1, 2, 3, 6, 7, 2, 4, 5, 8])
In [238]: c=np.unique(a) #计算a中的唯一元素,并返回有序结果
In [239]: c
Out[239]: array([1, 2, 3, 4])
#-----------计算a,b中的公共元素,并返回有序结果-----------
In [240]: np.intersect1d(a,b)
Out[240]: array([1, 2, 3, 4])
#-----------计算a,b中的并集,并返回有序结果-----------
In [241]: np.union1d(a,b)
Out[241]: array([1, 2, 3, 4, 5, 6, 7, 8])
#----------a元素是否存在于b的一个布尔型数组-------
In [242]: np.in1d(a,b)
Out[242]: array([ True, True, True, True, True, True, True, True, True], dtype=bool)
#-----------集合的差,元素在x中不在y中------
In [244]: np.setdiff1d(a,b)
Out[244]: array([], dtype=int32)
#---------------集合的异或-----------
In [246]: np.setxor1d(a,b)
Out[246]: array([5, 6, 7, 8])
"""