numpy 学习笔记

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

 

 

 

你可能感兴趣的:(python)