Numpy1
一、为什么要用到numpy
- 是一个工具箱,专门做数据处理。
- 列表无法对数值进行批量运算,numpy可以提供新的数据结构,对这种新的结构进行处理即可实现。
- 需要有专门的库文件提供各种数值计算函数,如最大值最小值平均值。
- 导入一般使用
import numpy as np
用于缩写。
二、基础用法
- 最大值最小值平均值
max(a);min(a)mean(a) - 从列表产生数组 a+1 a*2 a*a 对于数组,这些对于每一个元素的操作都可以实现。
1
2L = [0,1,2,3]
a = np.array(L)
三、numpy数组基础
- 一维数组,不再多说
- 二维数组
1
2
3
4b = np.array([1.0,2,3],[2,3,4],[3,4,5]) #产生一个三行三列的数组。当其中一个带小数点,会自动全加上。
np.zeros() #生成全0数组,括号里可以填“5”、“(2,3)”,分别生成一行五列、两行三列的全零数组。
np.empty() #生成未初始化的数组,元素随机。
np.ones() #生成全1数组。 - 序列数组
1
np.arange([start],stop,[step]) #左闭右开,取不到stop。
- 随机数组
1
2np.random.uniform(low,high,size) #随机小数 下限 上限 数量。数量可以是“(2,3)”这样的列表,用于生成数组。
np.random.randint(low,high,size) #随机整数 下限 上限 数量。数量可以是“(2,3)”这样的列表,用于生成数组。 - 数组属性
1
2
3
4a = np.array(...)
a.shape #返回(n,m) 查询数组行列。
a.size #查看元素数量。
a.dtype #查看元素类型。
四、索引与切片
- 一维数组索引
1
2
3a = np.array(...)
a[0] #索引第零个元素。
a[0] = 10 #修改第零个元素。 - 一维数组切片
1
2
3a[1:3] #左闭右开。
a[1:-2] #支持负数,取到倒数第三个数。
a[::2] #支持省略,三个数表示起始、终止、步长。-1表示反着来。 - 二维数组索引
1
2
3
4a = np.random.randint(1,10,(3,4))
a[1,3] #序号从0开始记。
a[1] #索引第一行。
a[:,1] #索引第一列。 - 二维数组切片
1
2
3
4a[0,3:5] #第零行的编号3、4元素。
a[-2:,-2:] #取最后两行最后两列。
a[:,3] #第三行
a[3::2,::2] #取出第三行开始没两个的行以及0、2、4列的交点。 - 切片的本质是引用。
切片在内存中使用的是引用机制。引用机制意味着,没有为b分配新的存储地址,这时,当b改变,a也会改变。省空间。1
2a = np.arrary([0,1,2,3,4])
b = a[2:4]
但这种现象在列表不存在。
可以使用copy()的方法产生复制,用于申请新的内存。1
b = a[2:4].copy()
五、花式索引
一维花式索引
index索引:1
2
3a = np.arange(0,100,10) #连续的0到90。
index = [1,2,-3] #index是一个列表。
Y = a[index] #取出编号1 2 -3的元素组成数组。不论是列表还是数组都可以这样取值。布尔索引:
1
2
3a = np.random.randint(1,11,10)
b = a>5 #这时候b是一个数组,包含有布尔值的数组。
a[b] #即可取出所有大于5的元素。- 二维花式索引
1
2a[(0,1,2,3,4),(1,2,3,4,5)] #取出第零行第一个、第一行第二个...
a[a%2 == 0] #布尔索引,取出所有偶数,但取出的是一维数组。- 注意一下,花式索引取出的b,是一个复制而不是引用。
- where语句
1
2np.where(a > 10) #返回一个元组,包含了索引的位置。
a[np.where(a > 10)] #返回数组,包含符合要求的元素。当然,直接用`a[a>10]`也可以,但这属于是布尔索引了。六、元素计算
- 加减乘除,幂运算指数运算
a+1 a**2 2**a
…
还有个np.exp(a)
,e的多少次方。 - 常用numpy方法
a*b
数组点乘。表示求矩阵内积。
np.pi
→π,np.sin(a)
,可以求三角函数。 - 限定小数位数
np.round(a,2)
限定两位小数 - reshape
当a是一个一行12列的。
a.reshape(3,4)
在并不改变原数组的情况下,输出一个三行四列的数组,可以赋值给其他变量。 - 数组排序
arr = np.random.randint(1,100,size=(5,4))
sort会使原本的数组发生变化。
arr.sort(1)
对每一行在本行内排序。
arr.sort(0)
对每一列在本列内排序。- 调用方式的小tips:对numpy的数组数据而言,np.function(array)和array.function()是等效的,dot、reshape、sort、copy、sum、cumsum、max、min、mean、std等同理。但是,对于mean,np.mean()可以处理数组和列表,a.mean()只能处理数组。
- 数组转置
1
2
3a = np.arange(10)
b = a.reshape(2,5) #变成两行五列。
c = b.transpose() #行列互换,编程五行两列。也可以用c = b.T。单一个b.T和reshape一样,无法变成新的,赋值到c才可以。