NumPy基本使用

简介

一句话介绍

NumPy是高性能科学计算和数据分析的基础包。它是pandas等其他各种工具的基础。

主要功能

  1. ndarray,一个多维数组结构,高效且节省空间
  2. 无需循环对整组数据进行快速运算的数学函数

注意:数组不同与python中列表,数组中的元素类型是一致的,并且数组长度也是确定的。

安装

pip install numpy

引用方式

import numpy as np

创建ndarray对象

创建

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

常用属性

  1. T 数组的转置(对高维数组而言)

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

  2. dtype 数组元素的数据类型:

    • bool_, int(8,16,32,64), uint(8,16,32,64), float(16,32,64)
    • 类型转换:astype()
  3. size 数组元素的个数

  4. ndim 数组的维数

  5. shape 数组的维度大小(以元组形式)

创建ndarray对象的方式

  1. array() 将列表转换为数组,可选择显式指定dtype

  2. arange() range的numpy版,支持浮点数(步长可以是小数)

    a = np.arange(1, 10, 1.2)
    """
    array([ 1. ,  2.2,  3.4,  4.6,  5.8,  7. ,  8.2,  9.4])
    """
    
    
    # 一维转二维:reshape()方法
    
    a = np.arange(15).reshape(3,5)
    """
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14]])
    """

  3. linspace() 类似arange(),第三个参数为数组长度(分为几份);(补充:计算机不能表示连续的的东西,比如计算机绘制函数图,其实就是打点,将一段数分为尽可能多的份数)

    a = np.linspace(0, 10, 6)
    """
    array([  0.,   2.,   4.,   6.,   8.,  10.])
    """

  4. zeros() 根据指定形状和dtype创建全0数组

    a = np.zeros(10)
    """
    step 1:假如一个数字占4个字节(32为机器),划分40字节的内存空间
    step 2: 对这些内存空间清零(默认是浮点型)
    array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
    """
    
    
    # 创建二维数组(理解为表格)
    
    a = np.zeros((3,5), dtype='int')
    """
    array([[0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0]])
    """
    
    
    # 创建三位数组(理解为一本表格,有3页,每页4行5列)
    
    a = np.zeros((3,4,5), dtype='int')
    """
    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, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0]],
    
           [[0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0]]])
    """

  5. ones() 根据指定形状和dtype创建全1数组

  6. empty() 根据指定形状和dtype创建空数组(随机值)

    a = np.empty(10)
    """
    比起zeros() 少了第二步(内存空间内还存在原来的值),因此如果创建完数组确定要重新赋值,可以选择这种方式,速度快。
    array([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.])
    """

  7. eye() 根据指定边长和dtype创建单位矩阵

  8. tolist() ndarray对象(数组)转列表:

索引和切片

简单计算

数组和数字(向量与标量)之间

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

b = a + 1  # array([2, 3, 4, 5])
b = a * 3  # array([ 3,  6,  9, 12])
b = 1 / a  # array([ 1.        ,  0.5       ,  0.33333333,  0.25      ])
b = 1 // a # array([1, 0, 0, 0], dtype=int32)
b = a ** 0.5 # array([ 1.        ,  1.41421356,  1.73205081,  2.        ])

同样大小数组之间的运算

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

a + b  # array([ 6,  8, 10, 12])
a / b  # array([ 0.2       ,  0.33333333,  0.42857143,  0.5       ])
a ** b  # array([    1,    64,  2187, 65536], dtype=int32)

数组的索引

# 一维数组,同python中的列表
a = np.arange(10)
a[3]  # 3 

## 二维数组,用逗号,逗号左边是行,右边是列
a = np.arange(10).reshape(2,5)
'''
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
'''
a[1,3] # 第1行第3个元素:8

数组的切片(顾头不顾尾)

# 一维切片,同python中的列表

# 二维切片
a = np.arange(15).reshape(3,5)
"""
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
"""

# 对数组a  6-8-11-13的矩形区域切片
# 用逗号,逗号左边是行,右边是列:从第1行切到最后,再从第一列切到第4列(不包含)
a[1:, 1:4] # 
"""
array([[ 6,  7,  8],
       [11, 12, 13]])
"""

# 切片的拷贝问题
a = np.arange(10)  # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
b = a[0:5]  # array([0, 1, 2, 3, 4])  
b[1] = 666
""" a
array([  0, 666,   2,   3,   4,   5,   6,   7,   8,   9])

注意:
如果是python的列表,对a切片赋值给b是深拷贝,会划分新的内存空间,对b中元素的修改不影响a
但是,对于ndarray对象,由于常用来处理大数据,默认执行的是浅拷贝(数据量太大,深拷贝费空间),b相当于是a的一个视图,因此对b中元素的修改,将导致对a的修改
"""

# 解决方案:
b = a[0:5].copy()  # 执行深拷贝,这样对b中元素的修改不会影响a

布尔型索引

问题1:给一个数组,选出数组中所有大于5的数。

a = np.array([1,3,8,9,11,2])
a[a>5]  # array([ 8,  9, 11])

"""
a>5会对a中的每一个元素进行判断,返回一个布尔数组
布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组
"""

问题2:给一个数组,选出数组中所有大于5的偶数。

a = np.array([1,3,8,9,11,2])
a[(a>5) & (a%2==0)]  # array([8])

"""
注意:两个条件必须用括号括起来,因为 & 运算符的优先级高
"""

问题3:给一个数组,选出数组中所有大于5的数和偶数。

a = np.array([1,3,8,9,11,2])
a[(a>5) | (a%2==0)]  # array([ 8,  9, 11,  2])

注意,非 的逻辑运算符是 ~ 飘号

a = np.array([True, False])
~a  # array([False,  True], dtype=bool)

花式索引

中括号中存的是用逗号分隔的下标

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

b = [1, 3, 6]  # [] 中存的是下标
a[b]  # array([2, 4, 7])

# 二维
a =np.arange(15).reshape(3,5)
"""
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
"""

# 切片其中的 6 8 11 13
a[1:,[1, 3]]
"""
array([[ 6,  8],
       [11, 13]])
"""

# 选出其第一列和第三列,组成新的二维数组。
a =np.arange(15).reshape(3,5)
a[:,[1,3]]
"""
array([[ 1,  3],
       [ 6,  8],
       [11, 13]])
"""

# 注意,不要在逗号的左右两边同时使用花式索引
a[[1,2],[1,3]]
"""
array([ 6, 13])
"""

通用函数

概念:能同时对数组中所有元素进行运算的函数

一元函数

abs, sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan

ceil, floor, rint, trunc 这几个函数用于浮点数转整数;trunc相当于python中的int();rint()四舍五入,相当与python中的round();

isnan, isinf,用于判断是nan 和 inf;注意, nan, inf 是浮点数的两个特殊值:

isinf表示无限大,是一个float型(5/0 除数越小,结果越大,除数趋近于零时,就是无限大。)

而nan, 表示不是一个数,甚至也不等于它本身!

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

c = a/b  # array([  1.,   2.,   3.,   4.,  inf])
np.isinf(c)  # array([False, False, False, False, True], dtype=bool)
c[~np.isinf(c)]  # 布尔索引 array([ 1.,  2.,  3.,  4.])

float('inf')  # inf
type(float('inf'))  # float

float('nan')  # nan
type(float('nan'))  # float

# nan不等于任何数
float('nan') == 1.5  # False
float('nan') == float('inf')  # False
float('nan') == float('nan')  # False

二元函数

add, substract, multiply, divide, power, mod, 这些二元函数用的相对较少,因为可以直接用 符号

maximum, mininum, 比较两个数组,取其中最大/最小部分构成新的数组

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

数学和统计方法

调用方式np.func(obj)obj.func()

sum 求和

mean 求平均数

std 求标准差(方差开根号)

var 求方差(每个数减平均值再平方的结果,相加求平均

平均值一样时,方差/标准查,反映数据的离散程度

# a, b, c三个数组的平均值相同
a = np.array([7,8,10,8,7])
b = np.array([8,8,8,8,8])
c = np.array([10,8,6,10,6])

# 通过方差反映离散程度
np.var(a) # 1.2
np.var(b) # 0.0
np.var(c) # 3.2000000000000002

均值加减 n倍的标准差,可以估计数据的范围

import random
a = np.array([random.uniform(10,20) for i in range(10)])
"""
array([ 14.59699686,  12.69868323,  11.06636046,  11.62997516,
        14.65875624,  12.84485756,  14.87239277,  10.47546367,
        12.55186776,  14.45094081])
"""

# 一倍
a.mean() - a.std()*1  # 11.460966440505564
a.mean() + a.std()*1  # 14.508292464563356

# 二倍
a.mean() - a.std()*2  # 9.9373034284766675
a.mean() + a.std()*2  # 16.031955476592252

min 求最小值

max 求最大值

argmin 求最小值索引

argmax 求最大值索引

随机数生成

随机数函数在np.random子包中,比起Python的random模块,其可以产生二维数组

rand 给定形状产生随机数组(0到1之间的数)

randint 给定形状产生随机整数

np.random.randint(10,20,(3,5))
"""
array([[15, 14, 15, 16, 14],
       [14, 12, 10, 10, 13],
       [12, 12, 13, 10, 18]])
"""

choice 给定形状产生随机选择

np.random.choice([1,2,3,4,5],10)
"""
array([4, 1, 3, 4, 2, 1, 5, 5, 3, 1])
"""

np.random.choice([1,2,3,4,5],(3,5))
"""
array([[1, 5, 3, 3, 1],
       [4, 3, 1, 4, 2],
       [3, 3, 5, 3, 3]])
"""

shuffle 与random.shuffle相同

uniform 给定形状产生随机浮点数组

a = np.random.uniform(10,20,(3,5))
"""
array([[ 11.08600377,  10.59471275,  16.25737906,  11.0429535 ,
         16.12688335],
       [ 15.38383353,  10.8729155 ,  14.77521291,  13.75258492,
         14.54417658],
       [ 17.8514871 ,  13.61437731,  16.87297584,  14.22388704,
         18.50198588]])
"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值