美文网首页
numpy入门

numpy入门

作者: dounine | 来源:发表于2020-01-20 09:23 被阅读0次

0. 前言

鉴于在卓越班暑期学习中,接触到机器学习的内容,索性深入研究一番,蹭一蹭机器学习的热度。

众所周知,学习机器学习之前,必须学习数据分析。而numpy则是数据分析的第一道关。

numpy的官网中,如此介绍:

NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。

由此可见,numpy是一个以数组为基础,包含各种骚操作和数学运算的框架。

1. 对比

俗话说,没有对比就没有伤害。numpy为何这么优秀呢?先让我们了解一下原生python的不足:

  • 无法用广播的方式操作数组,例如:

    l = [1,2,3]
    print(l*2) # 输出: [1, 2, 3, 1, 2, 3],而不是[2,4,6]
    
    print(l+l) # 输出: [1, 2, 3, 1, 2, 3],而不是[2,4,6]
    
    print(list(map(lambda x: x * 2, l))) # 才输出: [2,4,6]
    
  • 无法快速生成一个数组,如:

    print(range(1, 100, 2)) # 输出:range(1, 100, 2)
    print(list(range(1, 100, 2))) # 才输出:[1,3...97,99]
    
  • 对于大量数据的相乘处理,速度很慢。

  • 等等,详情见官网。

为什么numpy运算速度很快呢,因为numpy底层采用预编译的c语言程序运行,比如数组相乘。

另外,numpy与matlab对比

2. 入门

numpy数组的核心是ndarray对象。

2.1. 数组创建

>>> import numpy as np

# 依据数组进行创建
>>> a = np.array([1,2,3])
>>> a
array([1, 2, 3])

# 自动决定数据类型
>>> a.dtype
dtype('int32')

# 创建时指定数据类型
>>> a = np.array( [ [1,2], [3,4] ], dtype=complex )
>>> a
array([[1.+0.j, 2.+0.j],
       [3.+0.j, 4.+0.j]])

# 生成全0数组
>>> a = np.zeros((3,4))
>>> a
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])

# 全1数组
>>> a = np.ones((2,3,4))
>>> a
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.]]])

# 生成等差数组arange(start, stop, step)
>>> a = np.arange(10,30,5)
>>> a
array([10, 15, 20, 25])

# 生成随机数
>>> a = np.random.random((3,4))
>>> a
array([[0.58929938, 0.54624629, 0.08792059, 0.76392006],
       [0.44203064, 0.12489059, 0.90234191, 0.43714071],
       [0.30633888, 0.71889312, 0.42413405, 0.66626242]])

# 生成服从标准正态分布的随机数。
>>> a = np.random.randn(10)
>>> a
array([ 0.70899314, -0.80225292, -1.03481739,  0.23374236,  1.37977021,
       -1.68141055,  0.04312959, -1.2086538 ,  0.83465968, -0.24310517])

# numpy.random.normal(loc, scale, size), loc均值、scale标准差、size个数,生成普通正态分布。

2.2. ndarray对象属性

>>> import numpy as np
>>> a = np.arange(10,30,1).reshape(2,10)
>>> a
array([[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]])

# 维度的个数,几维
>>> a.ndim
2

# 维度,如(2,10)代表2行10列
>>> a.shape
(2, 10)

# 数组元素个数
>>> a.size
20

# 元素类型
>>> a.dtype
dtype('int32')

2.3. 基础运算

2.3.1. 简单运算

>>> import numpy as np
>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> a
array([20, 30, 40, 50])
>>> b
array([0, 1, 2, 3])

# 两个对象相减/相乘等,广播至数组的每一个元素
>>> a-b
array([20, 29, 38, 47])
>>> a*b
array([  0,  30,  80, 150])

# 单个对象运算,广播操作至数组的每一个元素
>>> b**2
array([0, 1, 4, 9], dtype=int32)

# 逻辑运算
>>> a<35
array([ True,  True, False, False])

# +=, *= 等运算
>>> a += 3
>>> a
array([23, 33, 43, 53])

2.3.2. 进阶数学运算

  • 求和、最大值、最小值
>>> a = np.arange( 4 )
>>> a
array([0, 1, 2, 3])

# 所有元素求和
>>> a.sum()
6

# 所有元素最小值
>>> a.min()
0

# 所有元素最大值
>>> a.max()
3


>>> b = np.arange(12).reshape(3,4)
>>> b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

# 第一维度/列 求和
>>> b.sum(axis=0)
array([12, 15, 18, 21])

# 第二维度/行 求最小值
>>> b.min(axis=1)
array([0, 4, 8])


>>> b = np.arange(12).reshape(3,2,2)
>>> b
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])
>>> b.sum(axis=0)
array([[12, 15],
       [18, 21]])
>>> b.sum(axis=1)
array([[ 2,  4],
       [10, 12],
       [18, 20]])
>>> b.sum(axis=2)
array([[ 1,  5],
       [ 9, 13],
       [17, 21]])
  • 矩阵运算
>>> A = np.array( [[1,1],
...             [0,1]] )
>>> B = np.array( [[2,0],
...             [3,4]] )

# 按元素运算
>>> A * B
array([[2, 0],
       [0, 4]])

# dot() 矩阵运算,区别于按元素运算
>>> A.dot(B)
array([[5, 4],
       [3, 4]])
  • 正弦、余弦、e^x、均值、标准差、开根
>>> a = np.arange( 4 )
>>> a
array([0, 1, 2, 3])

# sin() 正弦函数
>>> np.sin(a)
array([0.        , 0.84147098, 0.90929743, 0.14112001])

# cos() 余弦函数
>>> np.cos(a)
array([ 1.        ,  0.54030231, -0.41614684, -0.9899925 ])

# exp() e^x函数
>>> np.exp(a)
array([ 1.        ,  2.71828183,  7.3890561 , 20.08553692])

# mean() 均值函数,也可以a.mean()
>>> np.mean(a)
1.5

# std() 标准差函数,也可以a.std()
>>> np.std(a)
1.118033988749895

# sqrt() 开根函数
>>> np.sqrt(a)
array([0.        , 1.        , 1.41421356, 1.73205081])

2.4. 索引与切片

>>> import numpy as np
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

# 下标索引,与原生数组类似
>>> a[0]
>>> a[-1]
array([ 8,  9, 10, 11])
>>> a[0][1]
1

# 赋值 + 切片的运用。a[0][::2]表示:第一行中从头到尾遍历,每次加2
>>> a[0][::2] = -1
>>> a
array([[-1,  1, -1,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

# 输出指定的行或列,注意在同一中括号中,如:[0:1,1]
>>> a[0:1, 1]
array([1])
>>> a[0:2, 1]
array([1, 5])
>>> a[:, 1]
array([1, 5, 9])

2.5. 形状操控

>>> import numpy as np
>>> a = np.arange(12)
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

# 修改形状,需要原形状匹配,比如:12 = 3x4
>>> a.reshape(3,4)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

# 单纯调用函数,不会改变原数组
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

# 重新赋值才会改变
>>> a = a.reshape(3,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> a.shape
(3, 4)

# 变成一维
>>> a = a.ravel()
>>> a
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])


>>> a = a.reshape(2,6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

# 装置矩阵
>>> a.T
array([[ 0,  6],
       [ 1,  7],
       [ 2,  8],
       [ 3,  9],
       [ 4, 10],
       [ 5, 11]])

# 自动整形
>>> a.reshape(3,-1)
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

2.6. 合并

>>> a = np.floor(10*np.random.random((2,2)))
>>> a
array([[ 8.,  8.],
       [ 0.,  0.]])
>>> b = np.floor(10*np.random.random((2,2)))
>>> b
array([[ 1.,  8.],
       [ 0.,  4.]])

# 垂直方向合并
>>> np.vstack((a,b))
array([[ 8.,  8.],
       [ 0.,  0.],
       [ 1.,  8.],
       [ 0.,  4.]])

# 水平方向合并
>>> np.hstack((a,b))
array([[ 8.,  8.,  1.,  8.],
       [ 0.,  0.,  0.,  4.]])

2.7. 转换

>>> import numpy as np
>>> a_list = [1,2,3,4,5]
>>> b_numpy = np.array(a_list) # python原生列表转numpy数组
>>> b_numpy
array([1, 2, 3, 4, 5])
>>> c_list = b_numpy.tolist() # numpy数组转列表
>>> c_list
[1, 2, 3, 4, 5]

相关文章

  • Numpy简易入门笔记

    来自 AI基础:Numpy简易入门手动运行了一遍实例代码,笔记待查于此处。 Numpy 简易入门 Numpy是 N...

  • numpy 学习(待更新)

    numpy 学习 标签(空格分隔): 机器学习 Numpy 入门 一、安装 pip install numpyor...

  • Numpy

    1.numpy.tile(A,B)函数,实例验证 快速入门 Numpy[https://mp.weixin.qq....

  • NumPy之 索引技巧

    系列文章 一次性搞定NumPy入门基础知识NumPy之操控ndarray的形状NumPy之浅拷贝和深拷贝NumPy...

  • Numpy语法入门(一)

    1 Numpy简易入门 1.1 认识Numpy数组对象 1.1.1 np.arange In [1]: Out[1...

  • numpy-n2

    [TOC]说明:本文是numpy入门的第二篇笔记。 numpy的智能切片 numpy提供了比原始python强大的...

  • Python编程&数据科学入门 Lesson4

    第四课 - NumPy 入门 本课内容: 0. 导入 NumPy 包 1. 创建 NumPy 数组 2. 索引和切...

  • Numpy 学习图谱

    在学习 Numpy 的时候,整理了一份 Numpy 学习图谱,希望同样可以帮助到想要入门 Numpy 的朋友。 N...

  • 【Chapter 4】 NumPy基础:数组和矢量计算

    【Chapter 4】 NumPy基础:数组和矢量计算 使用 Python 进行科学计算:NumPy入门 NumP...

  • 对 NumPy.dot() 的理解

    【对 Numpy.dot() 的理解】 我看了一下 「使用 Python 进行科学计算:NumPy入门 」 这个教...

网友评论

      本文标题:numpy入门

      本文链接:https://www.haomeiwen.com/subject/tmxjzctx.html