Numpy基础教程

  • numpy创建数组(矩阵)

    1.从Python中的列表、元组等类型创建ndarray数组

    In [1]: import numpy as np
    
    In [2]: np.array([0,1,2,3])
    Out[2]: array([0, 1, 2, 3])
    
    In [3]: np.array((0,1,2,3))
    Out[3]: array([0, 1, 2, 3])
    
    In [4]: np.array([[1,2],[3,4]])
    Out[4]:
    array([[1, 2],
           [3, 4]])
    
    In [5]: np.array([[1,2],(3,4)])
    Out[5]:
    array([[1, 2],
           [3, 4]])
    
    In [6]: np.array(range(12))
    Out[6]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    

    2.使用NumPy中函数创建ndarray数组,如:arange, ones, zeros等

     
    14657665-3c4f35a0386b609f.png
     
    In [7]: np.full((3,4),5)
    Out[7]:
    array([[5, 5, 5, 5],
           [5, 5, 5, 5],
           [5, 5, 5, 5]])
    

    3.使用NumPy中其他函数创建ndarray数组

 
14657665-f7b3a26cc20dbd93.png
 

arange与linspace区别:

arange()类似于内置函数range(),通过指定开始值、终值和步长创建表示等差数列的一维数组,注意得到的结果数组不包含终值。

linspace()通过指定开始值、终值和元素个数创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。

In [8]: a=np.linspace(1,10,4)

In [9]: a
Out[9]: array([ 1.,  4.,  7., 10.])

In [10]: b=np.linspace(1,10,4,endpoint=False)

In [11]: b
Out[11]: array([1.  , 3.25, 5.5 , 7.75])

In [12]: c=np.concatenate((a,b))

In [13]: c
Out[13]: array([ 1.  ,  4.  ,  7.  , 10.  ,  1.  ,  3.25,  5.5 ,  7.75])
  • 数组对象的属性

 
14657665-ae0e6fc5dbbb6ab7.png
 
  • 数组的类名与类型

    In [13]: type(a)
    Out[13]: numpy.ndarray
    
    In [14]: a.dtype
    Out[14]: dtype('int32')
    
 
14657665-bab092ee533bf669.png
 
  • 数据类型的操作

  • 指定创建的数组的数据类型

    In [18]: a=np.array([1,0,1,0],dtype=np.bool)#或者使用dtype=bool
    
    In [19]: a
    Out[19]: array([ True, False,  True, False])
    
  • 修改数组的数据类型

    In [22]: a.astype(np.int8)
    Out[22]: array([1, 0, 1, 0], dtype=int8)
       
    
  • 修改浮点数的小数位数

    In [27]: b
    Out[27]: array([0.08333333, 0.16666667, 0.25      , 0.33333333, 0.41666667])
    
    In [28]: np.round(b,2)
    Out[28]: array([0.08, 0.17, 0.25, 0.33, 0.42])
    
  • 数组的形状

    In [29]: a=np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
    
    In [30]: a
    Out[30]:
    array([[3, 4, 5, 6, 7, 8],
           [4, 5, 6, 7, 8, 9]])
    
  • 查看数组的形状

    In [31]: a.shape
    Out[31]: (2, 6)
    
    
  • 修改数组的形状

    In [32]: a.reshape(3,4)
    Out[32]:
    array([[3, 4, 5, 6],
           [7, 8, 4, 5],
           [6, 7, 8, 9]])
    
    
  • 把数组转化为一维数组

    In [34]: b=a.reshape(3,4)
    
    In [35]: b
    Out[35]:
    array([[3, 4, 5, 6],
           [7, 8, 4, 5],
           [6, 7, 8, 9]])
    
    In [36]: b.reshape(1,12)
    Out[36]: array([[3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9]])#这是二维数组
    
    In [37]: b.reshape(12)
    Out[37]: array([3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9])
    
    In [38]: b.flatten()#将数组展开
    Out[38]: array([3, 4, 5, 6, 7, 8, 4, 5, 6, 7, 8, 9])
        
    
    
  • 数组向列表的转换

    In [22]: a
    Out[22]: array([ 1.,  4.,  7., 10.])
    
    In [23]: type(a)
    Out[23]: numpy.ndarray
    
    In [24]: b=a.tolist()
    
    In [25]: type(b)
    Out[25]: list
    
    
  • NumPy一元函数

     
    14657665-92510d4f56ddb6d7.png
     
 
14657665-272a0022e0a6643f.png
 
In [26]: a=np.arange(24).reshape((2,3,4))

In [27]: np.square(a)
Out[27]:
array([[[  0,   1,   4,   9],
        [ 16,  25,  36,  49],
        [ 64,  81, 100, 121]],

       [[144, 169, 196, 225],
        [256, 289, 324, 361],
        [400, 441, 484, 529]]], dtype=int32)

In [28]: a=np.sqrt(a)

In [29]: a
Out[29]:
array([[[0.        , 1.        , 1.41421356, 1.73205081],
        [2.        , 2.23606798, 2.44948974, 2.64575131],
        [2.82842712, 3.        , 3.16227766, 3.31662479]],

       [[3.46410162, 3.60555128, 3.74165739, 3.87298335],
        [4.        , 4.12310563, 4.24264069, 4.35889894],
        [4.47213595, 4.58257569, 4.69041576, 4.79583152]]])

In [30]: np.modf(a)
Out[30]:
(array([[[0.        , 0.        , 0.41421356, 0.73205081],
         [0.        , 0.23606798, 0.44948974, 0.64575131],
         [0.82842712, 0.        , 0.16227766, 0.31662479]],

        [[0.46410162, 0.60555128, 0.74165739, 0.87298335],
         [0.        , 0.12310563, 0.24264069, 0.35889894],
         [0.47213595, 0.58257569, 0.69041576, 0.79583152]]]),
 array([[[0., 1., 1., 1.],
         [2., 2., 2., 2.],
         [2., 3., 3., 3.]],

        [[3., 3., 3., 3.],
         [4., 4., 4., 4.],
         [4., 4., 4., 4.]]]))

  • NumPy二元函数

     
    14657665-05194565c0ef9c51.png
     
  • 数组和数的计算

  • 加减乘除

    In [39]: a
    Out[39]:
    array([[3, 4, 5, 6, 7, 8],
           [4, 5, 6, 7, 8, 9]])
    
    In [40]: a+1
    Out[40]:
    array([[ 4,  5,  6,  7,  8,  9],
           [ 5,  6,  7,  8,  9, 10]])
    
    In [41]: a*3
    Out[41]:
    array([[ 9, 12, 15, 18, 21, 24],
           [12, 15, 18, 21, 24, 27]])
    
    
  • product()用于计算数组所有元素的乘积

    In [20]: a
    Out[20]: array([1, 2, 3])
    
    In [21]: np.product(a)
    Out[21]: 6
    
    
  • 数组与数组的计算

    In [45]: a
    Out[45]:
    array([[3, 4, 5, 6, 7, 8],
           [4, 5, 6, 7, 8, 9]])
    
    In [46]: b
    Out[46]:
    array([[ 9, 12, 15, 18, 21, 24],
           [12, 15, 18, 21, 24, 27]])
    
    In [47]: a+b
    Out[47]:
    array([[12, 16, 20, 24, 28, 32],
           [16, 20, 24, 28, 32, 36]])
    
    In [48]: a*b
    Out[48]:
    array([[ 27,  48,  75, 108, 147, 192],
           [ 48,  75, 108, 147, 192, 243]])
    
    
  • 不同维度的数组计算

    In [52]: c #1行6列数组
    Out[52]: array([1, 2, 3, 4, 5, 6])
    
    In [53]: a #2行6列数组
    Out[53]:
    array([[3, 4, 5, 6, 7, 8],
           [4, 5, 6, 7, 8, 9]])
    
    In [54]: a-c
    Out[54]:
    array([[2, 2, 2, 2, 2, 2],
           [3, 3, 3, 3, 3, 3]])
    
    In [55]: a*c 
    Out[55]:
    array([[ 3,  8, 15, 24, 35, 48],
           [ 4, 10, 18, 28, 40, 54]])
    In [62]: c #2行1列数组
    Out[62]:
    array([[1],
           [2]])
    
    In [63]: a #2行6列数组
    Out[63]:
    array([[3, 4, 5, 6, 7, 8],
           [4, 5, 6, 7, 8, 9]])
    
    In [64]: a-c
    Out[64]:
    array([[2, 3, 4, 5, 6, 7],
           [2, 3, 4, 5, 6, 7]])
    
    In [65]: a*c
    Out[65]:
    array([[ 3,  4,  5,  6,  7,  8],
           [ 8, 10, 12, 14, 16, 18]])
    
    In [66]: a+c
    Out[66]:
    array([[ 4,  5,  6,  7,  8,  9],
           [ 6,  7,  8,  9, 10, 11]])
    
    In [67]: a/c
    Out[67]:
    array([[3. , 4. , 5. , 6. , 7. , 8. ],
           [2. , 2.5, 3. , 3.5, 4. , 4.5]])
    
    
  • 轴(axis)

    在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2,3)),有0,1,2轴。

  • 二维数组的轴

     
    14657665-7c9fbf639bec1af6.png
     
  • 三维数组的轴

     
    14657665-d32f3ed7f46489ac.png
     
  • 一、二维数组的读取和存储

  • numpy读取数据

    CSV:Comma-Separated Value,逗号分隔值文件

    显示:表格状态

    源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

    由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据。

    np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
    
    
     
    14657665-6f164fe573855ea2.png
     
 
14657665-94e881a5c6d82910.png
 
In [101]: file_path=r'C:\Users\Administrator\Desktop\测量计算\youtube_video_data\US_video_data_numbers.csv'

In [102]: t1 = np.loadtxt(file_path,delimiter=",",dtype="int",unpack=True)

In [103]: print(t1)
[[4394029 7860119 5845909 ...  142463 2162240  515000]
 [ 320053  185853  576597 ...    4231   41032   34727]
 [   5931   26679   39774 ...     148    1384     195]
 [  46245       0  170708 ...     279    4737    4722]]
 

In [107]: t2=np.loadtxt(file_path,delimiter=",",dtype="int",skiprows=1,unpack=0)

In [108]: print(t2)
[[7860119  185853   26679       0]
 [5845909  576597   39774  170708]
 [2642103   24975    4542   12829]
 ...
 [ 142463    4231     148     279]
 [2162240   41032    1384    4737]
 [ 515000   34727     195    4722]]

  • numpy保存数据

    np.savetxt("weeksummary.csv",weeksummary,delimiter=',',fmt='%s')
    
    

    指定了文件名,需要保存的数组名,分隔符,存储浮点数格式:s字符串;f浮点数

     
    14657665-6b01f0b5d14c61fd.png
     
  • 多维数组的读取和存储

     
    14657665-55d3efd13e0828b9.png
     
import numpy as np
a=np.arange(100).reshape(5,10,2)
np.save("a.npy",a)
b=np.load("a.npy")
print(b)


  • numpy中的转置

    转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据。

    In [4]: t=np.arange(18).reshape(3,6)
    
    In [5]: t
    Out[5]:
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11],
           [12, 13, 14, 15, 16, 17]])
    
    In [7]: t.transpose()
    Out[7]:
    array([[ 0,  6, 12],
           [ 1,  7, 13],
           [ 2,  8, 14],
           [ 3,  9, 15],
           [ 4, 10, 16],
           [ 5, 11, 17]])
    
    In [8]: t.T
    Out[8]:
    array([[ 0,  6, 12],
           [ 1,  7, 13],
           [ 2,  8, 14],
           [ 3,  9, 15],
           [ 4, 10, 16],
           [ 5, 11, 17]])
    
    In [9]: t.swapaxes(1,0)
    Out[9]:
    array([[ 0,  6, 12],
           [ 1,  7, 13],
           [ 2,  8, 14],
           [ 3,  9, 15],
           [ 4, 10, 16],
           [ 5, 11, 17]])
    
    
  • numpy索引和切片

    In [12]: a=np.arange(12).reshape(3,4)
    
    In [13]: a 
    Out[13]:
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    In [14]: a[1] #取第二行
    Out[14]: array([4, 5, 6, 7])
    
    In [15]: a[:,2] #取第3列
    Out[15]: array([ 2,  6, 10])
    
    In [16]: a[1:3] #取第2-3行
    Out[16]:
    array([[ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    In [17]: a[:,2:5] #取第3-4列
    Out[17]:
    array([[ 2,  3],
           [ 6,  7],
           [10, 11]])
    In [21]: a[[0,2],:] #取第1,3行
    Out[21]:
    array([[ 0,  1,  2,  3],
           [ 8,  9, 10, 11]])
    
    
  • numpy中数值的修改

    In [26]: t
    Out[26]:
    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]])
    
    In [27]: t[:,2:4]
    Out[27]:
    array([[ 2,  3],
           [ 8,  9],
           [14, 15],
           [20, 21]])
    
    In [28]: t[:,2:4]=0
    
    In [29]: t
    Out[29]:
    array([[ 0,  1,  0,  0,  4,  5],
           [ 6,  7,  0,  0, 10, 11],
           [12, 13,  0,  0, 16, 17],
           [18, 19,  0,  0, 22, 23]])
    
    

    修改行列的值,我们能够很容易的实现,但是如果条件更复杂呢?

    比如我们想要把t中小于10的数字替换为3。

    In [29]: t
    Out[29]:
    array([[ 0,  1,  0,  0,  4,  5],
           [ 6,  7,  0,  0, 10, 11],
           [12, 13,  0,  0, 16, 17],
           [18, 19,  0,  0, 22, 23]])
    
    In [30]: t<10
    Out[30]:
    array([[ True,  True,  True,  True,  True,  True],
           [ True,  True,  True,  True, False, False],
           [False, False,  True,  True, False, False],
           [False, False,  True,  True, False, False]])
    
    In [31]: t[t<10]=3
    
    In [32]: t
    Out[32]:
    array([[ 3,  3,  3,  3,  3,  3],
           [ 3,  3,  3,  3, 10, 11],
           [12, 13,  3,  3, 16, 17],
           [18, 19,  3,  3, 22, 23]])
    
    

    那么问题来了:

    如果我们想把t中小于10的数字替换为0,把大于10的替换为10,应该怎么做?

    In [33]: t=np.arange(24).reshape(4,6)
    
    In [34]: t
    Out[34]:
    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]])
    
    In [35]: np.where(t<10,0,10) #numpy的三元运算符
    Out[35]:
    array([[ 0,  0,  0,  0,  0,  0],
           [ 0,  0,  0,  0, 10, 10],
           [10, 10, 10, 10, 10, 10],
           [10, 10, 10, 10, 10, 10]])
    
    
  • numpy中的clip(裁剪)

    小于10的替换为10,大于18的替换为了18,但是nan没有被替换,那么nan是什么?

    In [59]: t
    Out[59]:
    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]])
    
    In [60]: t2=t.astype(float) #nan为float类型
    
    In [61]: t2
    Out[61]:
    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.]])
    
    In [62]: t2[3,3:]=np.nan #nan为float类型
    
    In [63]: t2
    Out[63]:
    array([[ 0.,  1.,  2.,  3.,  4.,  5.],
           [ 6.,  7.,  8.,  9., 10., 11.],
           [12., 13., 14., 15., 16., 17.],
           [18., 19., 20., nan, nan, nan]])
    
    In [65]: t2.clip(10,18)
    Out[65]:
    array([[10., 10., 10., 10., 10., 10.],
           [10., 10., 10., 10., 10., 11.],
           [12., 13., 14., 15., 16., 17.],
           [18., 18., 18., nan, nan, nan]])
    
    
  • numpy中的nan和inf

    nan(NAN,Nan):not a number 表示不是一个数字

    什么时候numpy中会出现nan:

    ​ 当我们读取本地的文件为float的时候,如果有缺失,就会出现nan

    ​ 当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

    inf(-inf,inf):infinity, inf 表示正无穷,-inf 表示负无穷

    什么时候回出现inf包括(-inf,+inf)

    ​ 比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

    nan或者inf的类型

    In [66]: a=np.inf
    
    In [67]: type(a)
    Out[67]: float
    
    In [68]: a=np.nan
    
    In [69]: type(a)
    Out[69]: float
    
    
  • numpy中的nan的注意点

 
14657665-2096e02ff4dbe4df.png
 

那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?

比如,全部替换为0后,替换之前的平均值。如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行

那么问题来了:

​ 如何计算一组数据的中值或者是均值

​ 如何删除有缺失数据的那一行(列)[在pandas中介绍]

def fill_ndarray(t1):
    for i in range(t1.shape[1]):  #遍历每一列
        temp_col = t1[:,i]  #当前的一列
        nan_num = np.count_nonzero(temp_col!=temp_col)
        if nan_num !=0: #不为0,说明当前这一列中有nan
            temp_not_nan_col = temp_col[temp_col==temp_col] #当前一列不为nan的array

            # 选中当前为nan的位置,把值赋值为不为nan的均值
            temp_col[np.isnan(temp_col)] = temp_not_nan_col.mean()
    return t1

if __name__ == '__main__':
    t1 = np.arange(24).reshape((4, 6)).astype("float")
    t1[1, 2:] = np.nan
    print(t1)
    t1 = fill_ndarray(t1)
    print(t1)

结果如下:

[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7. nan nan nan nan]
 [12. 13. 14. 15. 16. 17.]
 [18. 19. 20. 21. 22. 23.]]
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7. 12. 13. 14. 15.]
 [12. 13. 14. 15. 16. 17.]
 [18. 19. 20. 21. 22. 23.]]

  • numpy中常用统计函数

    求和:t.sum(axis=None)

    均值:t.mean(a,axis=None) 受离群点的影响较大

    加权平均值:np.average(c,weights=t)

    In [11]: c
    Out[11]: array([1, 2, 3])
    
    In [12]: t=c
    
    In [13]: t
    Out[13]: array([1, 2, 3])
    
    In [14]: np.average(c,weights=t)
    Out[14]: 2.3333333333333335
    
    

    中值:np.median(t,axis=None)

    最大值:t.max(axis=None)

    比较取大值:np.maximum:(X, Y, out=None) #X 与 Y 逐位比较取其大者;最少接收两个参数

    In [20]: t1
    Out[20]:
    array([[ 0, 33, 34, 35,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    
    In [21]: t2
    Out[21]:
    array([[12, 13, 14, 15, 16, 17],
           [18, 19, 20, 21, 22, 23]])
    
    In [22]:  np.maximum(t1,t2) #比较取大值
    Out[22]:
    array([[12, 33, 34, 35, 16, 17],
           [18, 19, 20, 21, 22, 23]])
           
    In [23]: np.minimum(t1,t2)  #比较取小值
    Out[23]:
    array([[ 0, 13, 14, 15,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    
    
    

    最小值:t.min(axis=None)

    极值:np.ptp(t,axis=None) 即最大值和最小值之差

    方差:np.var(c)

    方差有两种定义:偏样本方差(总体方差)和无偏样本方差(样本方差)。

    偏样本方差的计算公式为:

    而无偏样本方差的公式为:

    当 ddof参数为0 时,计算偏样本方差;当 ddof为 1时,计算无偏样本方差,默认值为0。

    In [11]: a=np.arange(3)
    
    In [12]: a
    Out[12]: array([0, 1, 2])
    
    In [13]: np.var(a,ddof=0) # 偏样本方差
    Out[13]: 0.6666666666666666
    
    In [14]: np.var(a,ddof=1) # 无偏样本方差
    Out[14]: 1.0
        
    In [15]: np.std(a,ddof=0)
    Out[15]: 0.816496580927726
    
    In [16]: np.std(a,ddof=1)
    Out[16]: 1.0
    
    

    标准差:t.std(axis=None)

    标准差有两种定义:总体标准差和样本标准差。

    总体标准差公式:

​ 样本标准差公式:

  • 标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值反映出数据的波动稳定情况,越大表示波动越大,越不稳定。

  • numpy的梯度函数

     
    14657665-62f6ca5f58a841a5.png
     
In [23]: a=np.random.randint(0,20,(5))

In [24]: a
Out[24]: array([ 5, 18, 11, 10, 14])
#一侧值:(18-5)/1=13;两侧值:(11-5)/2=3
In [25]: np.gradient(a)
Out[25]: array([13. ,  3. , -4. ,  1.5,  4. ]) 

In [26]: c=np.random.randint(0,50,(3,5))

In [27]: c
Out[27]:
array([[ 4, 23, 23, 41, 49],
       [30, 32, 22, 13, 41],
       [ 9,  7, 22,  1,  0]])

In [28]: np.gradient(c)
Out[28]:
[array([[ 26. ,   9. ,  -1. , -28. ,  -8. ],
        [  2.5,  -8. ,  -0.5, -20. , -24.5], #最外层维度的梯度
        [-21. , -25. ,   0. , -12. , -41. ]]),
 array([[ 19. ,   9.5,   9. ,  13. ,   8. ],
        [  2. ,  -4. ,  -9.5,   9.5,  28. ], #第二层维度的梯度
        [ -2. ,   6.5,  -3. , -11. ,  -1. ]])]

  • 数组的拼接

    竖直拼接

    In [4]: t1
    Out[4]:
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    
    In [6]: t2
    Out[6]:
    array([[12, 13, 14, 15, 16, 17],
           [18, 19, 20, 21, 22, 23]])
    
    In [8]: np.vstack((t1,t2))
    Out[8]:
    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]])
    
    
    

    水平拼接

    In [9]: np.hstack((t1,t2))
    Out[9]:
    array([[ 0,  1,  2,  3,  4,  5, 12, 13, 14, 15, 16, 17],
           [ 6,  7,  8,  9, 10, 11, 18, 19, 20, 21, 22, 23]])
    
    
    
  • 数组的行列交换

    In [24]: t=np.arange(12,24).reshape(3,4)
    
    In [25]: t
    Out[25]:
    array([[12, 13, 14, 15],
           [16, 17, 18, 19],
           [20, 21, 22, 23]])
    
    In [26]: t[[1,2],:]=t[[2,1],:] #第2行与第3行交换
    
    In [27]: t
    Out[27]:
    array([[12, 13, 14, 15],
           [20, 21, 22, 23],
           [16, 17, 18, 19]])
    
    In [28]:  t[:,[0,2]]=t[:,[2,0]] #第1列与第3列交换
    
    In [29]: t
    Out[29]:
    array([[14, 13, 12, 15],
           [22, 21, 20, 23],
           [18, 17, 16, 19]])
    
    
  • numpy生成随机数

     
    14657665-f093031dc92438bd.png
     
#在0-1范围内随机取浮点数
In [10]: np.random.rand(3,4)
Out[10]:
array([[0.81290747, 0.59001749, 0.98388915, 0.5450704 ],
       [0.4436627 , 0.62666944, 0.65467164, 0.24130413],
       [0.11018308, 0.71224195, 0.51024083, 0.35018583]])
#标准正态分布
In [11]: np.random.randn(3,4)
Out[11]:
array([[-0.37706199,  1.4327175 , -0.61502341,  0.23868781],
       [-0.59052728, -1.70656216, -1.26575076,  0.79823001],
       [-0.78918198,  0.26395496,  0.96813851,  1.74659854]])
#上下限定范围随机取整数
In [12]: np.random.randint(10,20,(3,4))
Out[12]:
array([[14, 19, 13, 14],
       [14, 15, 10, 16],
       [11, 10, 17, 14]])
#上下限定范围随机取浮点数
In [13]: np.random.uniform(0,10,(3,4))
Out[13]:
array([[9.39514985, 4.4435068 , 8.51494792, 4.64526108],
       [0.4427993 , 0.49198364, 5.48385483, 2.44355702],
       [8.64128776, 7.19048908, 8.48646395, 6.11265874]])
#指定的正态分布
In [15]: np.random.normal(10,5,(3,4))
Out[15]:
array([[ 8.75188405,  5.21684615,  7.99871039,  9.90856039],
       [ 6.16204638,  8.55961468, 20.76441474,  6.97229357],
       [18.94705677, 12.52661497, 18.46105393,  8.74113972]])
#随机种子数
In [19]: np.random.seed(1)

In [20]:  np.random.randint(10,20,(3,4))
Out[20]:
array([[15, 18, 19, 15],
       [10, 10, 11, 17],
       [16, 19, 12, 14]])

In [21]: np.random.seed(1)

In [22]:  np.random.randint(10,20,(3,4))
Out[22]:
array([[15, 18, 19, 15],
       [10, 10, 11, 17],
       [16, 19, 12, 14]])

  • 多项式函数

    多项式函数是变量的整数次幂与系数的乘积之和,可以用下面的数学公式表示:

    例如:

    当x=0,1,2,3,4时,f=1,0,5,22,57

    In [22]: a=np.array([1,0,-2,1]) #其中a[0]是最高次的系数,a[-1]是常数项
    
    In [23]: a
    Out[23]: array([ 1,  0, -2,  1]) #用poly1d()将系数转换为poly1d(一元多项式)对象
    
    In [24]: p=np.poly1d(a)
    
    In [25]: p
    Out[25]: poly1d([ 1,  0, -2,  1])
    
    In [27]: p(1) #当x=1时,f=0
    Out[27]: 0
    
    In [28]: p(np.arange(5)) #当x=0,1,2,3,4时,f=1,0,5,22,57
    Out[28]: array([ 1,  0,  5, 22, 57])
    
    

    对 poly1d对象进行加减乘除运算相当于对相应的多项式函数进行计算。例如:

    In [29]: p
    Out[29]: poly1d([ 1,  0, -2,  1])
    
    In [30]: p+[-2,1] #和p+np.poly1d([-2, 1])相同
    Out[30]: poly1d([ 1,  0, -4,  2])
    
    In [31]: p-[-2,1] 
    Out[31]: poly1d([1, 0, 0, 0])
    
    In [32]: p
    Out[32]: poly1d([ 1,  0, -2,  1])
    
    In [33]: p*p # 两个3次多项式相乘得到一个6次多项式
    Out[33]: poly1d([ 1,  0, -4,  2,  4, -4,  1])
    
    

    多项式对象的deriv()和 imeg()方法分別计算多项式函数的微分和积分:

    In [35]: p
    Out[35]: poly1d([ 1,  0, -2,  1])
    
    In [36]: p.deriv()
    Out[36]: poly1d([ 3,  0, -2])
    
    In [37]: p.integ()
    Out[37]: poly1d([ 0.25,  0.  , -1.  ,  1.  ,  0.  ])
    
    In [38]: p.integ().deriv()==p
    Out[38]: True
    
    

    多项式函数的根可以使用roots()函数计算:

    In [39]: r=np.roots(p)
    
    In [40]: r
    Out[40]: array([-1.61803399,  1.        ,  0.61803399])
    
    In [41]: p(r) # 将根带入多项式计算,得到近似值为0
    Out[41]: array([2.33146835e-15, 4.44089210e-16, 1.11022302e-16])
    
    

    而 poly()函数可以将根转换回多项式的系数:

    In [42]: np.poly(r)
    Out[42]: array([ 1.00000000e+00, -7.77156117e-16, -2.00000000e+00,  1.00000000e+00])
    
    
  • numpy更多好用的方法

    1.获取最大值最小值的位置

    1. np.argmax(t,axis=0)
    2. np.argmin(t,axis=1)

    2.where函数与take函数 #尽量在一维数组中使用

    where函数:根据指定的条件获取满足的条件的数组元素的索引

    take函数:根据数组元素的索引获取其相应的元素值

    In [60]: t4
    Out[60]: array([12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
    
    In [63]: c=np.where(t4>15)
    
    In [64]: c
    Out[64]: (array([ 4,  5,  6,  7,  8,  9, 10, 11], dtype=int64),)
    
    In [65]:  np.take(t4,c)
    Out[65]: array([[16, 17, 18, 19, 20, 21, 22, 23]])
    
    

参考资料:
书籍:
《python科学计算》
《python数据分析基础教程》
《利用python进行数据分析》
视频:
《黑马程序员之数据分析》
《python数据分析与展示》

发布了50 篇原创文章 · 获赞 19 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_28368377/article/details/90187557