以下为本人自学(练习案例和阅读参考书《利用Python进行数据分析》)在学校课程中关于Numpy的用法总结笔记:
文章目录
创建ndarray:
- array= np.array(data)
- array.fill(0)
- np.linspace(start, end, num):起始值、终止值、元素个数
- np.arange(start, end, step,dtype = ):起始值、终止值、步长
- np.logspace(start, end, num):从10 ^ start 到 10 ^ end 均匀生成num个数字
- np.zeros() / np.ones() :生成全为0 / 1 的数组
print(np.zeros(3)) # [0. 0. 0.]
print(np.zeros((3, 3)))
'''
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
'''
print(np.ones((3, 3)) * 8)
'''
[[8. 8. 8.]
[8. 8. 8.]
[8. 8. 8.]]
'''
- np.zeros_like(array) / np.ones_like(array):生成与array形状相同的全为0 / 1的数组
- np.eye(a, b, k=) :生成a行b列对角线为1其余为0的矩阵;k默认为0,当为负数时表示低对角,正数时表示高对角
>>> np.eye(2,3)
array([[1., 0., 0.],
[0., 1., 0.]])
>>> np.eye(3,k=1)
array([[0., 1., 0.],
[0., 0., 1.],
[0., 0., 0.]])
>>> np.eye(4,5,k=-2)
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.]])
- np.identity():生成对角矩阵(单位矩阵)【方阵】
- np.random.randint(start,end,num) / np.random.randint(end, size=(,)):start/0 到 end的数据里面选num个或size形状的随机数
print(np.random.randint(0, 10, 3)) # [0 2 7]
print(np.random.randint(10, size=(5, 4))) # 返回的是随机的整数,左闭右开
'''
[[0 0 8 5]
[0 5 2 2]
[6 0 3 6]
[0 1 9 4]
[2 1 1 5]]
'''
- np.random.rand(num) / np.random.rand((a,b)) :0~1均匀分布
print(np.random.rand(10)) # 0~1均匀分布
# [0.74551281 0.06652034 0.15436721 0.21996444 0.72814643 0.18732605 0.2853264 0.98705669 0.70645348 0.21864115]
print(np.random.rand(3, 2)) # 所有的值都是从0到1
'''
[[0.55855614 0.83403845]
[0.91090671 0.16489897]
[0.23521679 0.73634089]]
- np.random.random_sample(num):0~1非均匀分布
- np.random.normal(mean, std, num):生成正态分布
- np.random.seed(100) :恒定的方式随机,常用于构建train test数据集
ndarray运算
- 普通的+ - * / 为对应位置运算
- 数值计算:
np.sum(array,axis=0) / array.sum(axis=0) :axis=0时纵向求和,axis=1时横向求和,无axis时全部数据求和
np.prod(array,axis=0) / array.prod(axis=0) :axis=0时纵向求乘积,axis=1时横向求乘积,无axis时全部数据求乘积
类似的还有min(),max(),mean(),std(),sqrt(),exp(),abs(),square(),sign()【计算正负号个数】,ceil()【大于等于该值的最小整数】,floor()【小于等于该值的最大整数】,… - array.cumsum() / array.cumprod():获得所有元素的累计和/累计积
- np.dot():
# 1维的时候是内积计算——np.dot() 不同维度是无法进行的
print(np.dot(x, y)) # 20
# 2维的时候就是矩阵运算
x.shape = 1, 2
y.shape = 2, 1
print(np.dot(x, y)) # [[20]]
print(np.dot(y, x))
'''
[[10 10]
[10 10]]
'''
- 逻辑运算
x = np.array([1, 1, 1, 4])
y = np.array([1, 1, 1, 1])
print(x == y) # [ True True True False]
print(np.logical_and(x == 1, y == 1)) # [ True True True False]
print(np.logical_or(x == 1, y == 1)) # [ True True True True]
- 截断操作:
array.clip(a,b):设置最小值和最大值【例子:信用分】
- 四舍五入
array.round():括号里为1时,四舍五入且保留1位小数 - 排序
np.sort(array, axis=0):如果axis=0为对每一列进行排序,若为1则是对每一行进行排序,若没写则默认为对每一行排序 - 指定规则排序
np.lexsort(b, a):先按照a排序,再按照b排序,输出结果索引
du_array = np.array([[1, 0, 6], [1, 7, 0], [2, 3, 1], [2, 4, 0]])
index = np.lexsort([-1 * du_array[:, 0], du_array[:, 2]]) # sort by du_array[:,2],then by -1*du_array[:,0]
print(index) # [3 1 2 0]
du_array = du_array[index]
print(du_array)
'''
[[2 4 0]
[1 7 0]
[2 3 1]
[1 0 6]]
'''
numpy.linalg运算
该部分在做金融应用中经常用到。
- np.linalg.inv():矩阵求逆
- np.linalg.solve():矩阵方程求解
ndarray数组结构/大小/维度查询&数据类型查询转换&数组形状转换:
- array.shape / np.shape(array)
- array.size() / np.size(array)
- array.ndim
- array.dtype
- array.astype(new type):常用类型为int8,float64,bool,object,string_,…
- array.reshape(a,b):转换成(a, b)格式的数组
- array[np.newaxis, :] / array[np.newaxis, :, np.newaxis] / …:增加维度
- np.expand_dims(a,axis=):即在相应的axis轴上扩展维度
- np.append(arr, values, axis=):
1)无axis:arr,values都将先展平成一维数组,然后沿着axis=0的方向在arr后添加values
2)axis=0:沿着arr行方向添加values
3)axis=1:沿着arr列方向添加values - array.squeeze():压缩,把没用的轴剔除掉【从数组的形状中删除单维度条目,即把shape中为1的维度去掉】
- array.flatten():多维数组拉平成一维【array.flatten()[2] = 10, array对应位置元素不改变】
- array.ravel():多维数组拉平成一维【array.ravel()[2] = 10, array对应位置元素改变】
- array.transpose() / array.T:转置,不改变原数据
- np.random.shuffle(array) : 常用于分类模型训练
数组连接
- np.concatenate((a, b), axis=1):为0时行拼接;为1时列拼接
- np.vstack((a, b)) / np.hstack((a, b)):v为行拼接;h为列拼接
a = np.array([[123, 456, 678], [3214, 456, 134]])
b = np.array([[1235, 3124, 432], [343, 13, 134]])
c = np.concatenate((a, b)) # 默认为行拼接
print(c, np.concatenate((a, b), axis=1)) # axis=1为列拼接
'''
[[ 123 456 678]
[3214 456 134]
[1235 3124 432]
[ 343 13 134]]
[[ 123 456 678 1235 3124 432]
[3214 456 134 343 13 134]]
'''
排序操作
插值排序
ndarray索引与切片
索引从0开始,左闭右开
- 一维形式与列表索引一致
- 多维/矩阵形式:
print(array1)
#array([[ 1, 2, 3],
# [ 4, 10, 6],
# [ 7, 8, 9]])
print(array1[1]) # array([ 4, 10, 6])
print(array[:,1]) # array([ 2, 10, 8])
print(array[0,0:2]) # array([1, 2])
- 布尔类型索引
array1 = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
array2 = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1], dtype=bool)
print(np.array(array1)[array2]) # [60 70 80 90]
array3 = array1 > 45
print(array3) # [False False False False False True True True True True]
print(np.array(array1)[array3]) # [50 60 70 80 90]
print(np.where(array1 > 40)) # (array([5, 6, 7, 8, 9], dtype=int64),)
print(array1[np.where(array1 > 40)]) # [50 60 70 80 90]
- 确定索引位置
array.argmin(axis=0):axis=0时纵向最小值的索引,axis=1时横向最小值的索引,无axis时全部数据最小值的索引
array.argmax(axis=0):axis=0时纵向最大值的索引,axis=1时横向最大值的索引,无axis时全部数据最大值的索引 - 对数据进行排列的索引
np.argsort(array)
array = np.array([[1.5, 1.3, 7.5], [5.6, 7.8, 1.2]])
print(np.argsort(array))
'''
[[1 0 2]
[2 0 1]]
'''
条件查询:np.where()
- 一个参数时:np.where(condition) ,根据条件输出布尔类型数组
- 多个参数时:np.where(condition1&condition2, x, y),根据条件判断,符合条件输出x,不符合条件输出y;但condition和x和y必须形状相同。
数组集合运算
- np.unique(array):用于找出数组中的唯一值并返回已排序的结果
- np.intersect1d(x,y):计算xy交集,并返回有序结果
- np.union1d(x,y):计算xy并集,并返回有序结果
- np.in1d(x,y):得到一个x是否包含于y的布尔类型数组
- np.setdiff1d(x,y):集合的差,即元素在x中而不在y中
- np.sexor1d(x,y):异或,集合的对称差,即存在一个数组但不同时存在于两个数组的元素
- np.inld(array, [, , , ]):测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组
ndarray数据赋值
若想赋值与array1相同的array2但不改变array1,就需要array2 = array1.copy()
如果使用的是array2 = array1, 则改变array2中的某元素,array1随之对应改变
- 对于ndarray结构来说,里面所有的元素必须是同一类型的
如果不是的话,会自动的向下进行转换
int/float/字符串
保存&读取数组
- np.savetxt(‘d4.txt’, array) : 保存科学计数法
- np.savetxt(‘d4.txt’, array, fmt=’%d’, delimiter=’,’) : 保存int型
- np.savetxt(‘d4.txt’, array, fmt=’%.2f’, delimiter=’,’) : 保存小数点两位
- np.save(‘array.npy’, array):注意:.npy后缀是保存数组
- np.savez(‘array.npz’, a=arr1, b=arr2):将多个数组保存到一个压缩文件中,将数组以关键字参数的形式传入即可
- np.load(‘array.npy’) :读取数组
- result = np.load(‘array.npz’) :读取
result[‘b’] >>> arr2
学习路上,持续更新哇~