numpy note3

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])
"""

猜你喜欢

转载自blog.csdn.net/zztingfeng/article/details/80101419