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]: <function ndarray.any>
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])
"""