Numpy数组
Numpy是高性能科学计算和数据分析的基础包。它也是pandas等其余数据分析的工具的基础,基本全部数据分析的包都用过它。NumPy为Python带来了真正的多维数组功能,而且提供了丰富的函数库处理这些数组。它将经常使用的数学函数都支持向量化运算,使得这些数学函数可以直接对数组进行操做,将原本须要在Python级别进行的循环,放到C语言的运算中,明显地提升了程序的运算速度。dom
安装方法:ide
pip install numpy函数
引用方式:工具
import numpy as np性能
这是官方认证的导入方式,可能会有人说为何不用from numpy import *
,是由于在numpy当中有一些方法与Python中自带的一些方法,例如max
、min
等冲突,为了不这些麻烦你们就约定俗成的都使用这种方法。大数据
Numpy的核心特征就是N-维数组对——ndarray.ui
接下来咱们能够经过具体的实例来展现一下ndarray的优点。
如今有这样一个需求:spa
已知若干家跨国公司的市值(美圆),将其换算为人民币
按照Python当中的方法
第一种:是将全部的美圆经过for循环依次迭代出来,而后用每一个公司的市值乘以汇率
第二种:经过map方法和lambda函数映射设计
这些方法相对来讲也挺好用的,可是再来看经过ndarray对象是如何计算的
经过ndarray这个多维数组对象可让这些批量计算变得更加简单,固然这只它其中一种优点,接下来就经过具体的操做来发现。
np.array()
接下来就多维数组举个例子:
有的人可能会说了,这个数组跟Python中的列表很像啊,它和列表有什么区别呢?
属性 | 描述 |
---|---|
T | 数组的转置(对高维数组而言) |
dtype | 数组元素的数据类型 |
size | 数组元素的个数 |
ndim | 数组的维数 |
shape | 数组的维度大小(以元组形式) |
T:转置 li1 = [ [1,2,3], [4,5,6] ] a = np.array(li1) a.T 执行结果: array([[1, 4], [2, 5], [3, 6]]) 就至关因而将行变成列,列变成行,它也是一个比较经常使用的方法
类型 | 描述 |
---|---|
布尔型 | bool_ |
整型 | int_ int8 int16 int32 int 64 |
无符号整型 | uint8 uint16 uint32 uint64 |
浮点型 | float_ float16 float32 float64 |
复数型 | complex_ complex64 complex128 |
整型: int32只能表示(-2**31,2**31-1),由于它只有32个位,只能表示2**32个数 无符号整型: 只能用来存正数,不能用来存负数 补充: astype()方法能够修改数组的数据类型
方法 | 描述 |
---|---|
array() | 将列表转换为数组,可选择显式指定dtype |
arange() | range的numpy版,支持浮点数 |
linspace() | 相似arange(),第三个参数为数组长度 |
zeros() | 根据指定形状和dtype建立全0数组 |
ones() | 根据指定形状和dtype建立全1数组 |
empty() | 根据指定形状和dtype建立空数组(随机值) |
eye() | 根据指定边长和dtype建立单位矩阵 |
一、arange(): np.arange(1.2,10,0.4) 执行结果: array([1.2, 1.6, 2. , 2.4, 2.8, 3.2, 3.6, 4. , 4.4, 4.8, 5.2, 5.6, 6. , 6.4, 6.8, 7.2, 7.6, 8. , 8.4, 8.8, 9.2, 9.6]) # 在进行数据分析的时候一般咱们遇到小数的机会远远大于遇到整数的机会,这个方法与Python内置的range的使用方法同样 ----------------------------------------------------------------- 二、linspace() np.linspace(1,10,20) 执行结果: array([ 1. , 1.47368421, 1.94736842, 2.42105263, 2.89473684, 3.36842105, 3.84210526, 4.31578947, 4.78947368, 5.26315789, 5.73684211, 6.21052632, 6.68421053, 7.15789474, 7.63157895, 8.10526316, 8.57894737, 9.05263158, 9.52631579, 10. ]) # 这个方法与arange有一些区别,arange是顾头不顾尾,而这个方法是顾头又顾尾,在1到10之间生成的二十个数每一个数字之间的距离相等的,先后两个数作减法确定相等 ---------------------------------------------------------------- 三、zeros() np.zeros((3,4)) 执行结果: array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]) # 会用0生成三行四列的一个多维数组 --------------------------------------------------------------------- 四、ones() np.ones((3,4)) 执行结果: array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) # 会用1生成三行四列的一个多维数组 ------------------------------------------------------------------------ 五、empty() np.empty(10) 执行结果: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) # 这个方法只申请内存,不给它赋值 ----------------------------------------------------------------------- 六、eye() np.eye(5) 执行结果: array([[1., 0., 0., 0., 0.], [0., 1., 0., 0., 0.], [0., 0., 1., 0., 0.], [0., 0., 0., 1., 0.], [0., 0., 0., 0., 1.]])
li1 = [ [1,2,3], [4,5,6] ] a = np.array(li1) a * 2 运行结果: array([[ 2, 4, 6], [ 8, 10, 12]])
# l2数组 l2 = [ [1,2,3], [4,5,6] ] a = np.array(l2) # l3数组 l3 = [ [7,8,9], [10,11,12] ] b = np.array(l3) a + b # 计算 执行结果: array([[ 8, 10, 12], [14, 16, 18]])
# 将一维数组变成二维数组 arr = np.arange(30).reshape(5,6) # 后面的参数6能够改成-1,至关于占位符,系统能够自动帮忙算几列 arr # 将二维变一维 arr.reshape(30) # 索引使用方法 array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29]]) 如今有这样一组数据,需求:找到20 列表写法:arr[3][2] 数组写法:arr[3,2] # 中间经过逗号隔开就能够了
arr数组 array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29]]) arr[1:4,1:4] # 切片方式 执行结果: array([[ 7, 8, 9], [13, 14, 15], [19, 20, 21]])
切片不会拷贝,直接使用的原视图,若是硬要拷贝,须要在后面加.copy()方法
最后会发现修改切片后的数据影响的依然是原数据。有的人可能对一点机制有一些不理解的地方,像Python中内置的都有赋值的机制,而Numpy去没有,实际上是由于NumPy的设计目的是处理大数据,因此你能够想象一下,假如NumPy坚持要将数据复制来复制去的话会产生何等的性能和内存问题。
如今有这样一个需求:给一个数组,选出数组种全部大于5的数。
li = [random.randint(1,10) for _ in range(30)] a = np.array(li) a[a>5] 执行结果: array([10, 7, 7, 9, 7, 9, 10, 9, 6, 8, 7, 6]) ---------------------------------------------- 原理: a>5会对a中的每个元素进行判断,返回一个布尔数组 a > 5的运行结果: array([False, True, False, True, True, False, True, False, False, False, False, False, False, False, False, True, False, True, False, False, True, True, True, True, True, False, False, False, False, True]) ---------------------------------------------- 布尔型索引:将一样大小的布尔数组传进索引,会返回一个有True对应位置的元素的数组
能对数组中全部元素同时进行运算的函数就是通用函数
常见通用函数:
可以接受一个数组的叫作一元函数,接受两个数组的叫二元函数,结果返回的也是一个数组
函数 | 功能 |
---|---|
abs、fabs | 分别是计算整数和浮点数的绝对值 |
sqrt | 计算各元素的平方根 |
square | 计算各元素的平方 |
exp | 计算各元素的指数e**x |
log | 计算天然对数 |
sign | 计算各元素的正负号 |
ceil | 计算各元素的ceiling值 |
floor | 计算各元素floor值,即小于等于该值的最大整数 |
rint | 计算各元素的值四舍五入到最接近的整数,保留dtype |
modf | 将数组的小数部分和整数部分以两个独立数组的形式返回,与Python的divmod方法相似 |
isnan | 计算各元素的正负号 |
isinf | 表示那些元素是无穷的布尔型数组 |
cos,sin,tan | 普通型和双曲型三角函数 |
函数 | 功能 |
---|---|
add | 将数组中对应的元素相加 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide、floor_divide | 除法或向下圆整除法(舍弃余数) |
power | 对第一个数组中的元素A,根据第二个数组中的相应元素B计算A**B |
maximum,fmax | 计算最大值,fmax忽略NAN |
miximum,fmix | 计算最小值,fmin忽略NAN |
mod | 元素的求模计算(除法的余数) |
补充内容:浮点数特殊值
浮点数:float
浮点数有两个特殊值:
一、nan(Not a Number):不等于任何浮点数(nan != nan) --------------------------------------------- 二、inf(infinity):比任何浮点数都大 ---------------------------------------------
函数 | 功能 |
---|---|
sum | 求和 |
cumsum | 求前缀和 |
mean | 求平均数 |
std | 求标准差 |
var | 求方差 |
min | 求最小值 |
max | 求最大值 |
argmin | 求最小值索引 |
argmax | 求最大值索引 |
随机数生成函数在np.random的子包当中
经常使用函数
函数 | 功能 |
---|---|
rand | 给定形状产生随机数组(0到1之间的数) |
randint | 给定形状产生随机整数 |
chocie | 给定形状产生随机选择 |
shuffle | 与random.shuffle相同 |
uniform | 给定形状产生随机数组 |