Python3 数据科学(二):Numpy


Numpy 入门介绍

对于数据分析来说,最常见的数据的格式是数组类型的,为了方便的对这种数据进行表示以及处理,便出现了 numpy 这个数据科学工具库。

一、使用numpy创建数组

import numpy as np

使用python列表来创建数组

list_1 = [1,2,3,4,5]

使用 np 中的 array 方法来创建一维数组,传入一个列表

array_1 = np.array(list_1)
array_1
array([1, 2, 3, 4, 5])
list_2 = [6,7,8,9,10]

创建二维数组,传入对象也是一个列表

array_2 = np.array([list_1,list_2])
array_2
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])

使用numpy 中的 arange 方法来创建数组

arange(start,end,step)

array_3 = np.arange(1,10)
array_3
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
np.arange(1,10,2)
array([1, 3, 5, 7, 9])

使用numpy中的zeros来创建0矩阵

np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.zeros([4,6])
array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])

使用numpy 中的 eye方法来创建单位矩阵

np.eye(5)
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

使用 numpy 中的 ones 方法来创建数组

np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

可以指定创建的数组的格式

np.ones((3,5), dtype=np.int32)
array([[1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1]], dtype=int32)

创建两个数组,纬度为 3*5

np.ones((2,3,5), dtype=np.int32)
array([[[1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1]],

       [[1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1]]], dtype=int32)

使用 numpy 中的 random 来快速的创建数组

使用randn 方法来创建给定个数的符合正态分布的随机数组

np.random.randn(10)
array([ 1.49329335, -0.19607173, -1.38688767, -0.66481528, -0.41751835,
        1.41316847, -0.29155437,  0.64598281,  0.55834756,  0.86754489])

使用randint 方法来创建在给定范围内的的随机int数

np.random.randint(10)
2

使用randint 方法传入指定的size 便可以创建指定大小的随机的数组

np.random.randint(10,size=(2,3))
array([[2, 9, 1],
       [4, 6, 1]])
np.random.randint(10,size=10)
array([5, 7, 9, 2, 8, 9, 5, 4, 6, 4])

使用 random 中的 random 方法来创建从0到1的随机数

np.random.random()
0.46541015425031074
np.random.random((2, 3))
array([[0.62410458, 0.40864464, 0.64083039],
       [0.0934563 , 0.90201295, 0.0297017 ]])

使用 numpy 中的 linspace 方法来创建数组

linspace(start,end,count)

此方法会从start开始到end结束,均匀的创建个数为count个一维数组

np.linspace(1, 10, 100)
array([ 1.        ,  1.09090909,  1.18181818,  1.27272727,  1.36363636,
        1.45454545,  1.54545455,  1.63636364,  1.72727273,  1.81818182,
        1.90909091,  2.        ,  2.09090909,  2.18181818,  2.27272727,
        2.36363636,  2.45454545,  2.54545455,  2.63636364,  2.72727273,
        2.81818182,  2.90909091,  3.        ,  3.09090909,  3.18181818,
        3.27272727,  3.36363636,  3.45454545,  3.54545455,  3.63636364,
        3.72727273,  3.81818182,  3.90909091,  4.        ,  4.09090909,
        4.18181818,  4.27272727,  4.36363636,  4.45454545,  4.54545455,
        4.63636364,  4.72727273,  4.81818182,  4.90909091,  5.        ,
        5.09090909,  5.18181818,  5.27272727,  5.36363636,  5.45454545,
        5.54545455,  5.63636364,  5.72727273,  5.81818182,  5.90909091,
        6.        ,  6.09090909,  6.18181818,  6.27272727,  6.36363636,
        6.45454545,  6.54545455,  6.63636364,  6.72727273,  6.81818182,
        6.90909091,  7.        ,  7.09090909,  7.18181818,  7.27272727,
        7.36363636,  7.45454545,  7.54545455,  7.63636364,  7.72727273,
        7.81818182,  7.90909091,  8.        ,  8.09090909,  8.18181818,
        8.27272727,  8.36363636,  8.45454545,  8.54545455,  8.63636364,
        8.72727273,  8.81818182,  8.90909091,  9.        ,  9.09090909,
        9.18181818,  9.27272727,  9.36363636,  9.45454545,  9.54545455,
        9.63636364,  9.72727273,  9.81818182,  9.90909091, 10.        ])

二、访问数组的属性

shape属性,数组的格式

np.random.random((5,6)).shape
(5, 6)

size属性,数组中元素的个数

np.random.random((5,6)).size
30

dtype属性,数组中元素的数据类型

array_2.dtype
dtype('int64')

假如数组中有多种类型的数据元素,那么便取其中精确度最高的类型做为数组的dtype

array_4 = np.array([[1,2,3],[4.0,5,6]])
array_4.dtype
dtype('float64')

ndim属性,返回数组的维度

array_4.ndim
2

三、访问数组中的元素

访问一维数组

切片,从1到4

array_1[1:5]
array([2, 3, 4, 5])

访问单个元素

array_1[4]
5

访问二维数组

二维数组,第1行第3列

array_2[1][3]
9

效果和上面相同

array_2[1,3]
9

二维数组切片,取出第0行,第二列到第4列的元素,返回结果还是数组

array_2[:1,2:5]
array([[3, 4, 5]])

四、数组的运算

创建两个数组

a = np.random.randint(10, size=(4,5))
b = np.random.randint(10, size=(4,5))
a
array([[6, 3, 6, 1, 9],
       [1, 2, 7, 8, 2],
       [4, 5, 5, 5, 9],
       [5, 9, 1, 6, 4]])
b
array([[0, 8, 1, 4, 7],
       [0, 4, 7, 0, 3],
       [7, 6, 8, 6, 8],
       [7, 5, 7, 6, 5]])

加法,对应元素相加

a + b
array([[ 6, 11,  7,  5, 16],
       [ 1,  6, 14,  8,  5],
       [11, 11, 13, 11, 17],
       [12, 14,  8, 12,  9]])

减法,对应元素相减

a - b
array([[ 6, -5,  5, -3,  2],
       [ 1, -2,  0,  8, -1],
       [-3, -1, -3, -1,  1],
       [-2,  4, -6,  0, -1]])

*乘,对应元素相乘

a * b
array([[ 0, 24,  6,  4, 63],
       [ 0,  8, 49,  0,  6],
       [28, 30, 40, 30, 72],
       [35, 45,  7, 36, 20]])

除法,对应元素相除

a / b
/Users/wx/Documents/learning_recode/learning/code/python/06-data_science/env/lib/python3.6/site-packages/ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in true_divide
  """Entry point for launching an IPython kernel.





array([[       inf, 0.375     , 6.        , 0.25      , 1.28571429],
       [       inf, 0.5       , 1.        ,        inf, 0.66666667],
       [0.57142857, 0.83333333, 0.625     , 0.83333333, 1.125     ],
       [0.71428571, 1.8       , 0.14285714, 1.        , 0.8       ]])

判断数组中是否有元素等于某个值

a == 8
array([[False, False, False, False, False],
       [False, False, False,  True, False],
       [False, False, False, False, False],
       [False, False, False, False, False]])

数组元素平方操作

a**2
array([[36,  9, 36,  1, 81],
       [ 1,  4, 49, 64,  4],
       [16, 25, 25, 25, 81],
       [25, 81,  1, 36, 16]])

数组点乘

c = np.random.randint(10, size=(5,4))
np.dot(a,c)
array([[ 92, 100,  57, 105],
       [104, 121,  87, 114],
       [106, 108,  72, 129],
       [105,  94,  55, 153]])
a.dot(c)
array([[ 92, 100,  57, 105],
       [104, 121,  87, 114],
       [106, 108,  72, 129],
       [105,  94,  55, 153]])

五、array 常用函数

a
array([[6, 3, 6, 1, 9],
       [1, 2, 7, 8, 2],
       [4, 5, 5, 5, 9],
       [5, 9, 1, 6, 4]])

sum 对数组的列求和,axis=0表示列

a.sum(axis=0)
array([16, 19, 19, 20, 24])

sum 对数组的列求和,axis=1表示行

a.sum(axis=1)
array([25, 20, 28, 25])

数组转置

a.T
array([[6, 1, 4, 5],
       [3, 2, 5, 9],
       [6, 7, 5, 1],
       [1, 8, 5, 6],
       [9, 2, 9, 4]])

将数组变换为一维形式

a.ravel()
array([6, 3, 6, 1, 9, 1, 2, 7, 8, 2, 4, 5, 5, 5, 9, 5, 9, 1, 6, 4])

使用 reshape 方法来将创建的一维数组重塑为多维数组

a.reshape(5,4)
array([[6, 3, 6, 1],
       [9, 1, 2, 7],
       [8, 2, 4, 5],
       [5, 5, 9, 5],
       [9, 1, 6, 4]])

还可以只指定reshape的行,而列自动计算

a.reshape(4,-1)
array([[6, 3, 6, 1, 9],
       [1, 2, 7, 8, 2],
       [4, 5, 5, 5, 9],
       [5, 9, 1, 6, 4]])

求数组的最大元素的角标

a.argmax(axis=1)
array([4, 3, 4, 1])

六、numpy中的常用函数

首先创建对应的数组

a = np.random.random((5,6))*10
a
array([[4.02328882, 3.69998358, 9.2737976 , 6.29746809, 7.02947323,
        7.93001415],
       [4.48590584, 7.08672183, 3.93131144, 6.3209545 , 7.63438103,
        2.29882062],
       [0.69189349, 2.19991943, 0.85033397, 5.08617205, 2.72773218,
        2.75640315],
       [1.31652461, 7.67284754, 0.69005903, 4.61865465, 5.62247565,
        8.77807969],
       [9.65790954, 6.65482521, 6.0680172 , 7.95164155, 9.01082267,
        5.09428131]])
  • np.floor:对数组中的元素进行向下取整
np.floor(a)
array([[4., 3., 9., 6., 7., 7.],
       [4., 7., 3., 6., 7., 2.],
       [0., 2., 0., 5., 2., 2.],
       [1., 7., 0., 4., 5., 8.],
       [9., 6., 6., 7., 9., 5.]])
  • np.exp:对数组中的元素做exp运算
np.exp(a)
array([[5.58845982e+01, 4.04466404e+01, 1.06551391e+04, 5.43194845e+02,
        1.12943550e+03, 2.77946613e+03],
       [8.87573145e+01, 1.19598073e+03, 5.09737829e+01, 5.56103541e+02,
        2.06809057e+03, 9.96242605e+00],
       [1.99749419e+00, 9.02428637e+00, 2.34042834e+00, 1.61769430e+02,
        1.52981541e+01, 1.57431153e+01],
       [3.73043411e+00, 2.14919266e+03, 1.99383322e+00, 1.01357579e+02,
        2.76573235e+02, 6.49040161e+03],
       [1.56450452e+04, 7.76522183e+02, 4.31823611e+02, 2.84023351e+03,
        8.19125719e+03, 1.63086594e+02]])
  • np.sqrt:对数组中的元素做求根操作
np.sqrt(a)
array([[2.00581375, 1.92353414, 3.04529105, 2.50947566, 2.65131538,
        2.81602808],
       [2.11799571, 2.66208975, 1.9827535 , 2.51415085, 2.76303837,
        1.51618621],
       [0.83180135, 1.48321254, 0.92213555, 2.25525432, 1.65158475,
        1.66024189],
       [1.14739906, 2.76999053, 0.83069792, 2.14910555, 2.37117601,
        2.96278242],
       [3.10771774, 2.57969479, 2.46333457, 2.81986552, 3.00180324,
        2.25705146]])
  • np.sin:对数组元素做sin运算
np.sin(a)
array([[-0.77181848, -0.52982222,  0.15040741,  0.01428229,  0.67891798,
         0.99711092],
       [-0.97446214,  0.71981552, -0.71015531,  0.03776021,  0.97598453,
         0.74649049],
       [ 0.63799639,  0.80854382,  0.75150078, -0.93095266,  0.40214687,
         0.37573476],
       [ 0.96784675,  0.98364002,  0.63658271, -0.99561015, -0.61367732,
         0.60255466],
       [-0.23102552,  0.36314387, -0.21351167,  0.99523506,  0.40223368,
        -0.92796107]])

接下来是一些简单的数组拼接切割操作

a = np.floor(np.random.random((5,6))*10)
b = np.floor(np.random.random((5,6))*10)
a
array([[7., 4., 0., 5., 0., 7.],
       [8., 7., 3., 5., 3., 9.],
       [4., 6., 4., 9., 9., 0.],
       [3., 0., 4., 0., 9., 0.],
       [2., 3., 7., 5., 3., 8.]])
b
array([[8., 7., 1., 5., 1., 1.],
       [3., 5., 8., 4., 1., 9.],
       [4., 3., 5., 3., 4., 4.],
       [6., 1., 6., 0., 3., 7.],
       [1., 5., 5., 5., 4., 4.]])
  • np.hstack:数组拼接(横向)
np.hstack((a,b))
array([[7., 4., 0., 5., 0., 7., 8., 7., 1., 5., 1., 1.],
       [8., 7., 3., 5., 3., 9., 3., 5., 8., 4., 1., 9.],
       [4., 6., 4., 9., 9., 0., 4., 3., 5., 3., 4., 4.],
       [3., 0., 4., 0., 9., 0., 6., 1., 6., 0., 3., 7.],
       [2., 3., 7., 5., 3., 8., 1., 5., 5., 5., 4., 4.]])
  • np.vstack:数组拼接(纵向)
np.vstack((a,b))
array([[7., 4., 0., 5., 0., 7.],
       [8., 7., 3., 5., 3., 9.],
       [4., 6., 4., 9., 9., 0.],
       [3., 0., 4., 0., 9., 0.],
       [2., 3., 7., 5., 3., 8.],
       [8., 7., 1., 5., 1., 1.],
       [3., 5., 8., 4., 1., 9.],
       [4., 3., 5., 3., 4., 4.],
       [6., 1., 6., 0., 3., 7.],
       [1., 5., 5., 5., 4., 4.]])
  • np.hsplit:数组分割,按行,3表示分为几份
np.hsplit(a,3)
[array([[7., 4.],
        [8., 7.],
        [4., 6.],
        [3., 0.],
        [2., 3.]]), array([[0., 5.],
        [3., 5.],
        [4., 9.],
        [4., 0.],
        [7., 5.]]), array([[0., 7.],
        [3., 9.],
        [9., 0.],
        [9., 0.],
        [3., 8.]])]
  • np.hsplit:数组分割,按行,(3,4)表示切分位置
np.hsplit(a,(3,4))
[array([[7., 4., 0.],
        [8., 7., 3.],
        [4., 6., 4.],
        [3., 0., 4.],
        [2., 3., 7.]]), array([[5.],
        [5.],
        [9.],
        [0.],
        [5.]]), array([[0., 7.],
        [3., 9.],
        [9., 0.],
        [9., 0.],
        [3., 8.]])]
  • np.vsplit:数组分割,按列,3表示分为几份
c = np.floor(np.random.random((6,6))*10)
np.vsplit(c,2)
[array([[1., 3., 0., 1., 6., 5.],
        [3., 9., 4., 3., 5., 1.],
        [1., 9., 7., 8., 8., 5.]]), array([[7., 6., 1., 6., 3., 7.],
        [0., 6., 7., 5., 8., 3.],
        [8., 0., 3., 5., 3., 5.]])]
  • np.tile:将一个数组进行扩展,可扩展为指定格式
a = np.array([1,2,3])
np.tile(a, (3,5))
array([[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
       [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3],
       [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]])
  • np.sort:对数组内的元素进行排序
np.sort(b, axis=0)
array([[1., 1., 1., 0., 1., 1.],
       [3., 3., 5., 3., 1., 4.],
       [4., 5., 5., 4., 3., 4.],
       [6., 5., 6., 5., 4., 7.],
       [8., 7., 8., 5., 4., 9.]])
  • np.argsort:获得数组值从小到大的索引
np.argsort(a)
array([[0, 1, 2],
       [0, 1, 2],
       [0, 1, 2]])

七、数组的复制

a = np.array([[1,2,3],[4,5,6],[7,8,9]])

1.简单复制,引用传递


b = a
b
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
b.shape = (1,9)
b
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
a
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
id(a)
4493390352
id(b)
4493390352

2.view方法浅拷贝,创建了新的对象,但共用值

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = a.view()
b
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
id(a)
4493391952
id(b)
4493392272
b.shape = (1,9)
b
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
b[:,5] = 10
b
array([[ 1,  2,  3,  4,  5, 10,  7,  8,  9]])
a
array([[ 1,  2,  3],
       [ 4,  5, 10],
       [ 7,  8,  9]])

3.copy:深拷贝,创建新的对象,完全复制值

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = a.copy()
b
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
id(a)
4493393552
id(b)
4493627760
b.shape = (1,9)
b
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
b[:,5] = 10
b
array([[ 1,  2,  3,  4,  5, 10,  7,  8,  9]])
a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])