Numpy

Numpy数组

  • 简介
  • ndarray
  • 通用函数
  • 其余

一 、简介

undefined

Numpy是高性能科学计算和数据分析的基础包。它也是pandas等其余数据分析的工具的基础,基本全部数据分析的包都用过它。NumPy为Python带来了真正的多维数组功能,而且提供了丰富的函数库处理这些数组。它将经常使用的数学函数都支持向量化运算,使得这些数学函数可以直接对数组进行操做,将原本须要在Python级别进行的循环,放到C语言的运算中,明显地提升了程序的运算速度。dom

安装方法:ide

pip install numpy函数

引用方式:工具

import numpy as np性能

这是官方认证的导入方式,可能会有人说为何不用from numpy import *,是由于在numpy当中有一些方法与Python中自带的一些方法,例如maxmin等冲突,为了不这些麻烦你们就约定俗成的都使用这种方法。大数据

二 、ndarray -多维数组对象

undefined

Numpy的核心特征就是N-维数组对——ndarray.ui

2.1 为何要是用ndarray?

接下来咱们能够经过具体的实例来展现一下ndarray的优点。
如今有这样一个需求:spa

已知若干家跨国公司的市值(美圆),将其换算为人民币

按照Python当中的方法
第一种:是将全部的美圆经过for循环依次迭代出来,而后用每一个公司的市值乘以汇率
第二种:经过map方法和lambda函数映射设计

这些方法相对来讲也挺好用的,可是再来看经过ndarray对象是如何计算的

undefined

经过ndarray这个多维数组对象可让这些批量计算变得更加简单,固然这只它其中一种优点,接下来就经过具体的操做来发现。

2.2 建立ndarray对象

np.array()

2.3 ndarray是一个多维数组列表

接下来就多维数组举个例子:

undefined

有的人可能会说了,这个数组跟Python中的列表很像啊,它和列表有什么区别呢?

  • 数组对象内的元素类型必须相同
  • 数组大小不可修改

2.4 经常使用属性

属性 描述
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]])
就至关因而将行变成列,列变成行,它也是一个比较经常使用的方法

2.5 数据类型

  • dtype
类型 描述
布尔型 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()方法能够修改数组的数据类型

undefined

2.6 ndarray-建立

方法 描述
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.]])

2.7 索引和切片

  • 数组和标量(数字)之间运算
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()方法

numpy切片

最后会发现修改切片后的数据影响的依然是原数据。有的人可能对一点机制有一些不理解的地方,像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 元素的求模计算(除法的余数)

undefined

补充内容:浮点数特殊值

浮点数:float
浮点数有两个特殊值:

一、nan(Not a Number):不等于任何浮点数(nan != nan)
---------------------------------------------
二、inf(infinity):比任何浮点数都大
---------------------------------------------
  • Numpy中建立特殊值:np.nan、np.inf
  • 数据分析中,nan常被用做表示数据缺失值

undefined

四 、其它

4.1 数学统计方法

函数 功能
sum 求和
cumsum 求前缀和
mean 求平均数
std 求标准差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引

4.2 随机数

随机数生成函数在np.random的子包当中

经常使用函数

函数 功能
rand 给定形状产生随机数组(0到1之间的数)
randint 给定形状产生随机整数
chocie 给定形状产生随机选择
shuffle 与random.shuffle相同
uniform 给定形状产生随机数组

undefined

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息