Numpy库快速入门

Numpy库快速入门

  • 使用np.array()创建数组
  • 使用np.zeros()创建一个全为零的数组
  • 使用shape获取数组的尺寸。
  • 使用ones创建全为1的二维数组。
  • 使用arange()创建递增数列和递减数列
    • 递增数列
    • 递减数列
  • 使用np.linspace()创建等距离分布的数组
  • 使用np.random.rand()生成数值在0~1之间的随机数组。
  • dtype()使用
    • 使用dtype()测试数组的数据类型。
    • 使用dtype()指定数据类型
    • dtype里的数据类型
  • 通过astype转换数据类型
  • 数学逻辑运算
    • 加法+
    • 除法/
    • 点乘
      • 使用np.dot()点乘
      • @乘
    • 平方根np.sqrt()
    • 三角函数np.sin()、np.cos()
    • 欧拉数 e e e的次方
    • 自然对数np.log()
    • 指数运算np.power()
    • 数乘
    • 最大最小值
      • 最值
      • 最值所在位置
    • 总和sum
      • 按行求和
      • 按列求和
    • 平均值mean
    • 中位数median
    • 方差var
    • 标准方差std
    • 切片
    • 条件筛选
      • 逻辑运算符

导入numpy库。

import numpy as np

使用np.array()创建数组

使用np.array([1,2,3,4,5])创建一个数组;数组中的参数是初始化一维数据,以列表来表示。

np.array([1,2,3,4,5]) # 创建数组
array([1, 2, 3, 4, 5])

使用np.zeros()创建一个全为零的数组

使用np.zeros((3,2))来创建一个全为零的数组;参数用元祖(3,2)来表示数组的尺寸,即3行2列。

np.zeros((3,2)) # 3行2列 全为0的数组
array([[0., 0.],
       [0., 0.],
       [0., 0.]])

Numpy中的数组可以是一维、二维或者更高维度。

  • 二维数组:存放矩阵或者表格数据。
  • 多维数组:表示更加复杂的数据。

使用shape获取数组的尺寸。

a=np.zeros((3,2))
a.shape # shape获取数组的尺寸
(3, 2)

使用ones创建全为1的二维数组。

np.ones((2,4)) # 2行4列 全为1的 二维数组
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.]])

使用arange()创建递增数列和递减数列

使用arange()创建递增数列和递减数列,参数写法和range()类似。

递增数列

np.arange(1,10) # 1-9递增的数列
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

递减数列

np.arange(30,6,-3) 
array([30, 27, 24, 21, 18, 15, 12,  9])

30是起始值,终值不超过6,而-3是步长。

使用np.linspace()创建等距离分布的数组

使用np.linspace(0,4,12)创建介于0到4之间等距离分布的12个数的数组。

0~4是区间范围,12是输出样本的总数。

np.linspace(0,4,12)
array([0.        , 0.36363636, 0.72727273, 1.09090909, 1.45454545,
       1.81818182, 2.18181818, 2.54545455, 2.90909091, 3.27272727,
       3.63636364, 4.        ])

使用np.random.rand()生成数值在0~1之间的随机数组。

通过np.random.rand(3,5)生成一个3行5列的数值在0~1之间的随机数组。

np.random.rand(3,5)
array([[0.67862159, 0.12482976, 0.32949449, 0.66781721, 0.61244637],
       [0.05901743, 0.20008822, 0.12040259, 0.28459513, 0.8051357 ],
       [0.93619322, 0.37511957, 0.54599208, 0.85768786, 0.42316584]])

dtype()使用

使用dtype()测试数组的数据类型。

数组默认的数据类型是64位浮点数。

a=np.random.rand(3,5)
a.dtype
dtype('float64')
b=np.linspace(0,4,12)
b.dtype
dtype('float64')
c=np.zeros((3,2))
c.dtype
dtype('float64')

当然也有例外。

d=np.arange(30,6,-3) 
d.dtype
dtype('int32')

使用dtype()指定数据类型

我们也可以在创建数组时使用dtype()指定其类型。

a=np.zeros((3,2),dtype=np.int32)
a.dtype
dtype('int32')

dtype里的数据类型

参数 数据类型
np.int8/16/32/64 整型
np.uint8/16/64 无符号整型
np.float32/64 浮点数
Bool 布尔数据类型(True或者False)
str 字符串
complex64/128 复数

通过astype转换数据类型

对于已有的数组可以通过astype转换其数据类型。

  • 这里将数组中的两个浮点数转换成整数,即直接舍去小数部分。

    a=np.array([
        [6.3,9,16],
        [12.3,28,29],
        [25,6,48]])
    b=a.astype(int)
    b
    
      array([[ 6,  9, 16],
             [12, 28, 29],
             [25,  6, 48]])
    
  • 也可将列表里的字符转换为整数类型。

    vector=np.array(['6','9','12','21'])
    vector=vector.astype(int)
    vector
    
      array([ 6,  9, 12, 21])
    

数学逻辑运算

在numpy中可以轻松地对数组完成基本的数学逻辑运算。

加法+

a=np.array([[1,2,3],
           [4,5,6],
           [7,8,9]])
b=np.array([[1,2,3],
           [4,5,6],
           [7,8,9]])
a+b
array([[ 2,  4,  6],
       [ 8, 10, 12],
       [14, 16, 18]])

除法/

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

点乘

将两个向量点乘运算,这是线性代数里的两个矩阵相乘的含义。

要求第一个矩阵的列与第二个矩阵的行相同。

使用np.dot()点乘

a=np.array([
    [1,2,3],
    [4,5,6],
])
b=np.array([
    [7,8],
    [9,10],
    [11,12]
])
np.dot(a,b)
array([[ 58,  64],
       [139, 154]])

@乘

另一个与点乘相关的是@乘,它与np.dot()的含义一样。

a=np.array([
    [1,2,3],
    [4,5,6],
])
b=np.array([
    [7,8],
    [9,10],
    [11,12]
])
a@b
array([[ 58,  64],
       [139, 154]])

平方根np.sqrt()

numpy中还可以使用sqrt()将对所有的数据元素依次求取平方根。

a=np.array([[1,2,3],
           [4,5,6],
           [7,8,9]])
np.sqrt(a)
array([[1.        , 1.41421356, 1.73205081],
       [2.        , 2.23606798, 2.44948974],
       [2.64575131, 2.82842712, 3.        ]])

三角函数np.sin()、np.cos()

np.sin(a)对a取正弦值,a可以是单个数据,也可以是数组,np.cos(a)同理。

a=np.pi
b=np.array([0,np.pi/2,np.pi])
print(np.sin(a),np.sin(b))
print(np.cos(a),np.cos(b))
1.2246467991473532e-16 [0.0000000e+00 1.0000000e+00 1.2246468e-16]
-1.0 [ 1.000000e+00  6.123234e-17 -1.000000e+00]

其中,np.pi表示 π \pi π,但是它并不能完全精确于 π \pi π,因此计算机计算出sin(np.pi)不是准确的0,而是无限接近于01

欧拉数 e e e的次方

使用np.exp(x)表示 e e e x x x次方,即 e x e^x ex

a=np.array([[1,2,3],
           [4,5,6],
           [7,8,9]])
print(np.exp(1))
print(np.exp(a))
2.718281828459045
[[2.71828183e+00 7.38905610e+00 2.00855369e+01]
 [5.45981500e+01 1.48413159e+02 4.03428793e+02]
 [1.09663316e+03 2.98095799e+03 8.10308393e+03]]

自然对数np.log()

a=np.array([[1,2,3],
           [4,5,6]])
print(np.log(np.exp(1)))
print(np.log(a))
1.0
[[0.         0.69314718 1.09861229]
 [1.38629436 1.60943791 1.79175947]]

指数运算np.power()

a=np.array([[1,2,3],
           [4,5,6]])
np.power(a,3)
array([[  1,   8,  27],
       [ 64, 125, 216]], dtype=int32)

其中power(a,3)表示对每一个数值求立方。

数乘

可以直接将一个数组与单独的一个数做运算。

numpy会分别计算每一个元素与这个数的乘积,相当于给这个数乘了一个系数。

  • 本例中的每一个数都扩大了10倍。

    a=np.array([[1,2,3],
               [4,5,6]])
    a*10
    
          array([[10, 20, 30],
                 [40, 50, 60]])
    
  • 如果两个矩阵尺寸不同,在运算之前会将两个数组扩展至相同的尺寸,这种操作在numpy里称作广播(Broadcast)2,然后将相同位置的元素相加。

    a=np.array([[1],
               [2],
               [3]])
    b=np.array([7,8,9])
    a+b
    
      array([[ 8,  9, 10],
             [ 9, 10, 11],
             [10, 11, 12]])
    

    其中,矩阵a由 ( 1 2 3 ) \left( \begin{smallmatrix} 1 &\\ 2 & \\ 3 & \end{smallmatrix} \right) (123)扩展为 ( 1 1 1 2 2 2 3 3 3 ) \bigl( \begin{smallmatrix} 1 & 1 & 1 \\ 2 & 2 & 2 \\ 3 & 3 & 3 \end{smallmatrix} \bigr) (123123123),矩阵b由 ( 7 8 9 ) \bigl( \begin{smallmatrix} 7 & 8 & 9 \\ \end{smallmatrix} \bigr) (789)扩展为 ( 7 8 9 7 8 9 7 8 9 ) \left( \begin{smallmatrix} 7 & 8 & 9 \\ 7 & 8 & 9 \\ 7 & 8 & 9 \end{smallmatrix} \right) (777888999)

最大最小值

最值

我们可以通过min和max返回数组中最小或者最大元素的值,

a=np.array([[1,2,3],
           [4,5,6]])
a.max()
6
a=np.array([[1,2,3],
           [4,5,6]])
a.min()
1

最值所在位置

而使用argmax和argmin返回数组中最大值和最小值所在的位置。

由于地址空间是线性的,所以即使是多维数组,其实也是线性存储,即一维排列。

  • 本例中的二维数组先存第一行1 2 3, 再存第二行4 5 6, 而6所在的这个位置,索引是从0开始,因此6的索引的下标就为5。

    a=np.array([[1,2,3],
               [4,5,6]])
    a.argmax()
    
      5
    
    a=np.array([[1,2,3],
               [4,5,6]])
    a.argmin()
    
      0
    

总和sum

sum返回所有数据的总和。

a=np.array([[1,2,3],
           [4,5,6]])
a.sum()
21

按行求和

如果是多维数组:

  • 加上axis=0会按行求和;

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

按列求和

  • 加上axis=1会按列求和。

    a=np.array([[1,2,3],
               [4,5,6]])
    a.sum(axis=1)
    
      array([ 6, 15])
    

因为axis=0表示多维数组中的第1维度,而axis=1表示多维数组中的第2维度。

平均值mean

mean返回数据的平均值。

a=np.array([[1,2,3],
           [4,5,6]])
a.mean()
3.5

中位数median

median返回数据的中位数。

a=np.array([[1,2,3],
	       [4,5,6]])
np.median(a)
3.5

方差var

var用来计算数据的方差。

a=np.array([[1,2,3],
	       [4,5,6]])
a.var()
    2.9166666666666665

标准方差std

std用来计算数据的标准方差。

a=np.array([[1,2,3],
	       [4,5,6]])
a.std()
    1.707825127659933

切片

获取数组的部分数据,即切片,其语法与Python中的list非常相似。

比如你想获取某个单个数据,a[0,1]表示取出下标为0 1的元素2。

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

下面这个例子当中使用了0:2这种切片的语法,0:2代表可以取出[0,2]这个区间但不包括2,这与Python中的list的切片方式完全一样。

a=np.array([[1,2,3],
           [4,5,6]])
a[0,0:2]
array([1, 2])

想要获取第0行的所有元素使用 a[0,:],第一个参数表示是第1行,第二个参数是列,但它只有一个冒号,冒号表示,列从开始到结束,即第一行的全部列。

a=np.array([[1,2,3],
           [4,5,6]])
a[0,:]
array([1, 2, 3])

此外,也可以直接写成a[0],即为二维数组的第1行的全部。

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

如果是三个冒号,则有点类似于range的三个参数,从下标为0到下标为7;第三个参数表示一个跨度。

  • 当跨度为2时,每隔两个数据取一个;

    a=np.array([1,2,3,4,5,6,7,8,9])
    a[0:8:2]
    
      array([1, 3, 5, 7])
    
  • 当跨度为3时,每隔三个数取一个。

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

这个跨度还可以取负数,下面这个例子取的是-1,从右向左逆向筛选,即从8到0前面的那个数,即下标为1的2。

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

最后一个写法的行和列全部都省略了,即为全部数据。

  • -1为逆向筛选,它的作用就是将数组翻转、逆序。

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

条件筛选

另外我们还可以通过条件筛选出指定的元素。

例如我们在方括号里输入a<5,则返回所有小于5的元素。

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

逻辑运算符

也可以通过逻辑运算符表达式组合出不同的条件。

  • &表示逻辑运算并且

    a=np.array([[1,2,3],
               [4,5,6]])
    a[(a>2)&(a%2==0)]
    
      array([4, 6])
    

    这个例子筛选出返回大于2的所有的偶数。

  • |表示逻辑运算符或者

    a=np.array([[1,2,3],
               [4,5,6]])
    a[(a>=5)|(a<=2)]
    
      array([1, 2, 5, 6])
    

    这个例子筛选出大于等于5或者小于等于2的数据。


  1. np.sin( )函数 (Numpy库) ↩︎

  2. Python/Numpy中的矩阵向量的广播(Broadcasting)特性 ↩︎

你可能感兴趣的:(Python数据分析,numpy)