Numpy
个人笔记,仅供参考,谢谢
导入
import numpy
import numpy as np
from numpy import *
Numpy数组对象
- 引入
# 让列表+1
a = [1,2,3,4],b = [4,5,6,7]
[x+1 for x in a]
# 实现a+b
a + b => [1,2,3,4,5,6,7,8]
[x + y for (x,y) in zip(a,b)]
-----------
# numpy
a = np.array([1,2,3,4])
a+1 => array([2,3,4,5])
b = np.array([2,3,4,5])
a + b =>array([3,5,7,9])
- 产生数组
# 从列表产生:
lst = [1,2,3]
a = np.array(lst)
# 从列表传入
a = np.array([1,2,3])
# 生成全0数组
np.zeros(5)
=> array([0.,0.,0.,0.,0.,]) # 默认浮点数
# 生成全1数组
np.ones(3)
=> array([1.,1.,1.])
np.ones(3,dtype='int') # 转换为整型,bool...
# fill 填充
a=np.array([1,2,3])
a.fill(6) # 所有元素变为6,长度取决于a原先的长度
a.fill(2.5) # 得到2,因为dtype = int,与列表不同
a = a.astype('float') # 类型强转
- 生成整数序列
a=np.arange(1,10) # 左闭右开,默认增1
a=np.arange(1,10,2) # (left, right, step)
- 生成等差序列
a = np.linspace(1,10,4) # 等差数列,左闭右闭,4为数列长度
- 生成随机数
np.random.rand(10) # 产生[0,1)的10个随机数
np.random.randn(10) # 产生标准正态分布[0,1)的10个随机数
np.random.randint(1,10,6)# 从1 到 10 的6个随机整数
- 数组属性
# 数组的数据类型
type(a)
# 查看数组元素数据类型
a.dtype
# 查看性状,每维的长度(n,m)
a.shape
# 查看元素数目
a.size
# 查看维度 1,2,3...
a.ndim
- 索引与切片
# 索引
a=np.array([0,1,2,3])
a[0] # 索引
a[0] = 1 # 修改py
# 切片,支持负索引
a[1:3] # 左闭右开
<=> a[1:-2] <=> a[-3,3]
# 省略参数
a[-2:] # -2到最后
a[::2] <=> a[1:a.size:2]
# 差分
a=[1,2,3,4]
rst = a[1:] - a[:-1]
多维数组及其属性
- 定义
a = np.array([[1,2],[3,4]]) # 二维数组,广义表
np.array([[[1,2],[2,0]],[[3,5],[6,7]]])
# 从外到内每对括号降一次维度
a.shape => (2,4) ; 2行4列
a.size => 4
a.ndim => 2
- 索引
a[1,1] => 4
a[0,0] => 1
a[0,1] = -1 # 赋值操作
a[1] => [1,2] #
a[:,1] => array([1, 11]) # 第二列
- 多维数组切片
a = np.array([0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45])
a[0,3:5] # 第一行的3-4号元素,左闭右开
a[4:,4:] # 得到第4,5行的最后两列
# 对于每一维都支持切片的规则,包括父索引
[lower:upper:step]
a[::2,:] # 取出奇数行
- 切片是引用
a=np.array([0,1,2,3,4])
b=a[2:4]
print(b)
b[0]=10
a # a 的值已经发生改变。 // 如果是列表则产生新列表
# 解决方案
a=np.array([0,1,2,3,4])
b=a[2:4].copy(); # 调用数组的方法
- 花式索引
a=np.arange(0,100,10)
index = [1,2,-3]
y = a[index]; # 666,玩的真花啊
# 布尔数组
mask = np.array([0,1,0,1,0,1,0,1,1,0],dtype=bool)
a[mask]; # 顾名思义,mask,必须与a等长
# 二维花式
a = np.array([0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55])
取出次对角线的5个值:
a[(0,1,2,3,4),(1,2,3,4,5)] # 一一对应成对
取出最后三行1,3,5列
a[3:,[1,2,5]]; #
a[:3],取出前三行
a[:,:3],取出前三列
a[:2,:3] 取出前2行三列
# 花式bool
mask=np.array([0,1,1,0,1,0]);
a[mask]; # 取出2,3,5行
where语句
a=np.array([0,12,5,20])
a > 10 # 返回array(false,true,false,true)
np.where(a > 10);# 返回所有大于10元素的索引位置
# 返回的是一个元组
a[a>10]; # 返回大于10的元素,花式了
a[np.where(a>10)] # 同样
数组类型
- 类型转换
a = np.array([1,5,-3],dtype=float)
a = np.array([1,2,3])
b = np.asarray(a,dtype=float)
b = a.astype(float)
数组操作
- sort函数
a = np.array(1,3,2)
b = np.sort(a) # 默认升序
- argsort函数
order = np.argsort(a) # 得到排序后元素在原来数组中的位置
- 聚合函数
np.sum(a)
# a.sum()
np.max(a)
# a.max()
np.min(a)
# a.min()
np.mean()
# a.mean()
np.std()
#np.std() 标准差
np.cov(a,b) # 相关系数矩阵
-
数组形状
a=np.arange(6) a.shape = 2,3 b = a.reshape(2,3)
-
转置
a.T # /a.transpose(), 不改变原值
- 数组连接
concatenate((a0,a1,...,an),axis=0)
x = np.array([[0,1,2],[10,11,12]])
y = np.array([[50,51,52],[60,61,62]])
print(x.shape)
print(y.shape)
# 默认沿着第一维连接, 最内侧的括号是第一维
z = np.concatenate(x,y)
z = np.concatenate((x,y),axis = 1)
# 堆叠函数
np.vstack((x,y))
np.hstack((x,y))
np.dstack((x,y)) # 3维
内置函数
np.abs(a)
np.exp(a)
np.median(a) # 中值
np.cumsum(a) # 前缀和
...
练习
import numpy as np
a = np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
a
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
a[:2,:3]
array([[ 0, 1, 2],
[10, 11, 12]])
b=np.array([0,2,66,2,77])
b[np.where(b<10)]
np.where(b<10)
(array([0, 1, 3], dtype=int64),)
a=np.array([1,2,3])
np.asarray(a,float)
array([1., 2., 3.])
a = np.array([1,2,3])
b = np.array([2,4,5])
np.cov(a,b)
array([[1. , 1.5 ],
[1.5 , 2.33333333]])
import pandas as pd
a = pd.Series([1,2,3],index = ['a',2,3])
a['a']
a.values
a.astype(float)
a.name
a
a 1
2 2
3 3
dtype: int64
import numpy as np
a = np.array([3]*4)
a
array([3, 3, 3, 3])
df2 = pd.DataFrame({'A':1.,'B':pd.Timestamp('20181001'),'C':pd.Series(1,index=list(range(4)),dtype = float),'D':np.array([3]*4,dtype=float),'E':
pd.Categorical(['test','train','test','train']),'F':'anc'})
df2
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
0 | 1.0 | 2018-10-01 | 1.0 | 3.0 | test | anc |
1 | 1.0 | 2018-10-01 | 1.0 | 3.0 | train | anc |
2 | 1.0 | 2018-10-01 | 1.0 | 3.0 | test | anc |
3 | 1.0 | 2018-10-01 | 1.0 | 3.0 | train | anc |
df2.drop(['A','B'],axis = 1)
C | D | E | F | |
---|---|---|---|---|
0 | 1.0 | 3.0 | test | anc |
1 | 1.0 | 3.0 | train | anc |
2 | 1.0 | 3.0 | test | anc |
3 | 1.0 | 3.0 | train | anc |
df2.index = list('abcd')
df2
df2.loc['a','B']
Timestamp('2018-10-01 00:00:00')
df2
df2.loc['a','E'] = np.nan
df2.dropna(inplace=True)
df2[]
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
b | 1.0 | 2018-10-01 | 1.0 | 3.0 | train | anc |
c | 1.0 | 2018-10-01 | 1.0 | 3.0 | test | anc |
d | 1.0 | 2018-10-01 | 1.0 | 3.0 | train | anc |