NumPy基本使用

来源:互联网 发布:淘宝上苏泊尔是正品吗 编辑:程序博客网 时间:2024/06/16 12:38

简介

一句话介绍

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""" aarray([  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 13a[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')  # inftype(float('inf'))  # floatfloat('nan')  # nantype(float('nan'))  # float# nan不等于任何数float('nan') == 1.5  # Falsefloat('nan') == float('inf')  # Falsefloat('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.2np.var(b) # 0.0np.var(c) # 3.2000000000000002

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

import randoma = 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.460966440505564a.mean() + a.std()*1  # 14.508292464563356# 二倍a.mean() - a.std()*2  # 9.9373034284766675a.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]])"""
原创粉丝点击