加载中...

NumPy的使用


NumPy的使用

简介

1.概述

  NumPy是一个Python库,用于数值计算和处理数组。它是其他数据分析和机器学习库的底层库,提供了高效的多维数组运算功能。NumPy完全使用标准C语言实现,以提高运行效率。它是一款开源免费的库。并于1995年由Numeric项目发展而来。在2001年,Numpy被集成到Scipy库中,并进一步扩展了多维数组和矩阵运算的功能。

  numpy的核心:多维数组+数值计算(支持大量的维度数组与矩阵运算)

  1.代码简洁减少Python代码中的循环。

  2.底层实现:厚内核(C)+薄接口(Python),保证性能。

2. numpy基础

  内存中的ndarray对象由两个部分组成,一部分是元数据,是实际的数组数据,它是一个同质数组,即所有元素的数据类型必须相同。另外一部分是描述这些数据的元数据,这部分包含对目标数组的描述信息,如:ndim、dimensions、dtype、data等。实际数据将与元数据分开存放,一方面提高了内存空间的使用效率,另一方面减少了对实际数据的访问频率,提高了性能。

环境准备

要使用numpy,首先要安装numpy

pip3 install numpy

安装之后,进行导入使用

import numpy as np

下面创建一个 world_alcohol.txt 文件,后序简单使用中的部分操作都基于该文件数据。

Year,WHO region,County,Beverage Types,Display Value
1986,Western Pacific,Viet nam,Wine,0
1986,Americas,Uruguay,Other,0.5
1985,Africa,Cte d'Ivoire,Wine,1.62

简单使用

1. 创建数组

创建一维和多维数组

vector = np.array([1,2,3,4,5])             # 创建一维数组
print(vector)         # [1 2 3 4 5]
print(vector.shape)   # (5,)  数组形状
matrix = np.array([[5,10,15],[20,25,30]])  # 创建多维数组
print(matrix)
# [[ 5 10 15]
#  [20 25 30]]
print(matrix.shape)  # (2, 3)

numpy数据必须统一,如不统一将自动转换

numbers = np.array([1,2,3,'4'])
print(numbers)       # ['1' '2' '3' '4']
print(numbers.dtype) # <U21

2. array的参数

shape:返回数组的形状
ndim:返回数组的维数
size:返回数组中所有元素的总个数
dtype:返回数组中元素的数据类型
itemsize:返回数组中每个元素的字节大小
nbytes:返回数组占用的总字节数
import numpy as np
a = np.arange(15).reshape(3,5)
# array([[ 0,  1,  2,  3,  4],
#        [ 5,  6,  7,  8,  9],
#        [10, 11, 12, 13, 14]])

a.shape  # 形状
# (3,5)

a.ndim   # 纬度,因为只有行和列
# 2

a.dtype.name  # type类型是什么
# int32

a.size   # 多少个元素
#15

3. 读取&保存文件

world_alcohol = np.genfromtxt("world_alcohol.txt", delimiter=",", dtype=str, skip_header=1)

uruguay_other_1986 = world_alcohol[1,4]
third_country = world_alcohol[2,2]
print(uruguay_other_1986)   # 0.5
print(third_country)        # Cte d'Ivoire

np.savetxt('array.txt', world_alcohol, delimiter=",", fmt="%s")

4. 字符串操作

numpy字符串的操作方法和python字符串还是比较相似的。

str_list = ['-Hello-', 'wor-ld-']
  • strip 去除左右的符号

    array = np.char.strip(str_list, '-')
    # array(['Hello', 'wor-ld'], dtype='<U7')
    
    np.char.rstrip(str_list, '-')  # 只去除右边的
    # array(['-Hello', 'wor-ld'], dtype='<U7')
  • upper 转大写

    array = np.char.upper(str_list)
    # array(['HELLO', 'WORLD'], dtype='<U5')
  • replace 替换

    np.char.replace(array,'world','python')
    # array(['HELLO', 'WORLD'], dtype='<U5')
  • add 字符串添加

    np.char.add(['中国','国庆'],['海军','大阅兵'])
    # array(['中国海军', '国庆大阅兵'], dtype='<U5')
  • multiply 相乘

    np.char.multiply(['中国','万岁'], 3)
    # array(['中国中国中国', '万岁万岁万岁'], dtype='<U6')
  • join 连接

    np.char.join([':','-'],['hello','world'])
    # array(['h:e:l:l:o', 'w-o-r-l-d'], dtype='<U9')
  • split 分割

    str1 = "第一天学习了numpy\t我很开心11\t因为又学习了1个新的知识Numpy\n"
    arr = str1.split('\t')
    # ['第一天学习了numpy', '我很开心11', '因为又学习了1个新的知识Numpy\n'] <class 'list'>
  • find 查找索引位置,-1代表没有出现

    np.char.find(arr,'numpy')  # array([ 6, -1, -1])
  • islower 判断是只否包含小写字母

    np.char.islower(arr)  # array([ True, False, False])
  • isdigit 判断是否只包含数字

    np.char.isdigit(arr)  # array([False, False, False])
  • isalpha 判断是否只包含字母

    np.char.isalpha(arr)  # array([ True, False, False])
  • count 计数

    np.char.count(arr,'numpy')  # array([1, 0, 0])
  • startswith 以…开始

    np.char.startswith(arr,'第一天')  # array([ True, False, False])
  • endswith 以…结束

    np.char.endswith(arr,'numpy')  # array([ True, False, False])

5. 随机数相关

  • random 产生 [0.0, 1.0) 之间的浮点数

    np.random.random()
    # 0.9554174825034638
    
    np.random.random(5)
    # array([0.09838372, 0.91571684, 0.10749174, 0.93983929, 0.80454012])
    
    np.random.random((2,2))
    # array([[0.10535918, 0.8644841 ],
    #        [0.07228631, 0.74962662]])
  • seed 随机数种子

    np.random.seed(123)  # 初始化值固定的话再运行random值也是固定的
  • rand 产生均匀分布的随机数,即每个数的概率是一样的

    np.random.rand(2, 2)
    # array([[0.2058794 , 0.95992679, 0.12515654],
    #        [0.24656062, 0.96191233, 0.60677466]])
  • randint 产生[x, y)之间的整数

    np.random.randint(0,100,size=10)  # 产生0-100之间的整数
    # array([57, 71, 48, 63, 26, 66, 51,  2, 41, 60])
    
    np.random.randint(-10,10,size=[2,3])
    # array([[ -9,   7,  -8],
    #        [  6, -10,  -4]])
  • uniform 产生给定范围的随机数,含小数

    np.random.uniform(low=0,high=10,size=10)
    np.random.uniform(low=0,high=10,size=(2,5))
    # array([[8.04026368, 8.57651787, 9.22382355, 3.03380734, 3.39810854],
    #        [6.17186089, 4.04739486, 9.92478436, 0.98851285, 2.20603318]])
    
    np.set_printoptions(precision=3)  # 控制小数位数
    np.random.uniform(low=0,high=10,size=(2,5))
    # array([[2.286, 2.281, 9.429, 1.367, 1.147],
    #        [8.703, 9.933, 2.88 , 8.927, 6.642]])
  • normal 正态分布

    np.random.normal(1,3,size=5) # 实现正太分布,均值为1,标准差为3
    # array([-2.148, -1.894, -3.012, -1.264,  3.314])
  • mean 计算均值

    np.mean(np.random.normal(1,3,size=10000))  # 因为是随机数,数据越多,越接近1
    # 0.94732283465293
  • std 计算标准差

    np.std(np.random.normal(1,3,size=10000))  # 因为是随机数,数据越多,越接近差值
    # 2.992792860121099
  • randn 产生标准正太分布随机数

    np.random.randn(2,4)
    # array([[ 0.05 , -0.152, -1.183, -1.605],
    #        [-0.269, -1.426,  2.038, -0.352]])
  • 随机排序

    s = np.array([1,2,5,6,7,8,9])
    np.random.shuffle(s)  # 随机排序,直接影响本身
    print(s)    # [2 7 1 6 8 5 9]
    t = np.random.permutation(s)  # 随机排序,不影响本身
    print(s,t)  # [2 7 1 6 8 5 9], [6 7 9 5 8 2 1]

6. 统计相关函数

NumPy中有许多用于统计分析的函数,掌握常用的统计相关函数。

针对二维数组:需要注意轴的概念,0和1分别代表纵轴和横轴

data = np.random.random((2,3))
# array([[0.41974842, 0.73147378, 0.40841294],
#        [0.00162555, 0.68542205, 0.69612774]])
print(data.sum(axis=1))  # 对行进行求和
print(data.mean(axis=1)) # 对行进行计算均值 
print(data.max()) # 求最大值 
print(data.min()) # 求最小值 
print(data.cumsum()) # 累计求和 
print(data.cumprod()) # 累计求积

np.ptp(data) # 计算极差,最大值减最小值 data.max() - data.min()
np.sum(data > 0.5) # 计算有多少个符合条件的数据 
np.percentile(data,[0,50,100])  # 计算分位数值
  • sum 求和

    data.sum()        # 全部求和
    # 2.9428104748854564
    data.sum(axis=0)  # 对列求和
    # array([0.42137396, 1.41689583, 1.10454068])
    
    np.sum(data > 0.5)  # 计算有多少个符合条件的数据
  • mean 计算均值

    data.mean()       # 计算所有数的均值
    data.mean(axis=0) # 对列计算均值
  • max 取最大值

    data.max()       # 取所有数中的最大值
    data.max(axis=1) # 按行取最大值
    # array([0.73147378, 0.69612774])
  • min 取最小值

    data.max()       # 取所有数中的最小值
    data.max(axis=1) # 按行取最小值
  • np.ptp 计算极差

    np.ptp(data)          # 计算极差,最大值减最小值 data.max() - data.min()
    np.ptp(data, axis=0)  # 按列计算极差
  • cumsum 逐个求和

    data.cumsum()
    # array([0.41974842, 1.1512222 , 1.55963513, 1.56126068, 2.24668273, 2.94281047])
    data.cumsum(axis=0)  # 按列逐个求和
    # array([[0.41974842, 0.73147378, 0.40841294],
    #        [0.42137396, 1.41689583, 1.10454068]])
  • cumprod 逐个求积

    data.cumprod()
    data.cumsum(axis=1)  # 按行逐个求积

7. 线性代数

- 了解矩阵乘法
  - 二维数组中,第一个矩阵的列数必须要与第二个矩阵的行数相等
               (即第一个矩阵的行 * 第二个矩阵的列) 比较绕口
- 了解矩阵的转置和求逆
- 多远一次方程组求解
  • 矩阵乘法

    # 如果a和b都是一维数组,那么它返回的就是向量的内积。
    a = np.array([1,2,3])
    b = np.array([4,5,6])
    vector = np.dot(a,b)  # 1*4 + 2*5 + 3*6 = 32
    
    arr5 = np.array([5,15,25,40]).reshape(4,1)
    arr6 = np.arange(12).reshape(3,4)
    arr2d = np.dot(arr6,arr5)  # array([[185], [525], [865]])
    
    # 如果arr9和arr10都是二维数组,那么它返回的是矩阵乘法。
    arr9 = np.array([[6,-1],[8,1]])
    # [[ 6 -1]
    #  [ 8  1]] 
    arr10 = np.array([[6,10],[-1,1]])
    # [[ 6 10]
    #  [-1  1]]
    np.dot(arr9,arr10)
    # array([[37, 59],   37 = (6 * 6) + (-1 * -1)  59=(6*10) + (-1 * 1)
    #        [47, 81]])
  • 矩阵的转置

    data2 = ((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),(3.2,4.5,6,3,9),(11.2,13.4,15.6,17.8,19),(12,3.4,1.2,4,7))
    arr2 = np.array(data2)
    np.transpose(arr2) # 行列转换
    np.diag(arr2)      # 取对角线上的元素,左上角开始到右下
  • 多元一次方程组求解

    3x + 2y + z = 38
    2x + 3y + z = 34
    x + 2y + 3z = 26
    A = np.array([[3,2,1],[2,3,1],[1,2,3]])
    b = np.array([[39],[34],[26]])
    np.linalg.solve(A,b)
    # array([[9.25],
    #        [4.25],
    #        [2.75]])

8. 矩阵操作

a = np.array([[1,2],[7,8]])
b = np.array([[3,4],[9,10]])
c = np.array([[5,6],[11,12]])
  • np.concatenate 矩阵拼接

    e = np.concatenate([a,c,b], axis=1) # 按行拼接,默认按列进行拼接
    # array([[ 1,  2,  5,  6,  3,  4],
    #        [ 7,  8, 11, 12,  9, 10]])
  • 数值判断

    • 判断值否相等

      numbers = numpy.array([5,10,15,20])
      numbers == 10
      # array([False,  True, False, False])
      
      
      matrix = numpy.array([
          [5,10,15],
          [20,25,30]
      ])
      matrix == 25
      # array([[False, False, False],
      #        [False,  True, False]])
    • 获取并修改选中的值

      numbers = numpy.array([5,10,15,20])
      equal_to_ten = (numbers==10)
      print(equal_to_ten)           # [False  True False False]
      print(numbers[equal_to_ten])  # [10]
      
      vector = numpy.array([5,10,15,20])
      equal_to_ten_and_five = (vector==10) | (vector==5)
      print(equal_to_ten_and_five)  # [ True True False False]
      vector[equal_to_ten_and_five] = 50
      print(vector)  # [50 50 15 20]

文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录