【利用python进行数据分析】chapter12:numpy高级应用

本文介绍了NumPy库中的ndarray对象,包括其组成部分和基本操作,如重塑、合并、拆分、重复及索引。此外,还讲解了广播机制和ufunc函数的使用,以及排序功能。内容深入浅出,适合初学者了解和掌握NumPy的基础操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十一章是金融方面应用,因为我不学无术,所以就不写了。
终于最后一章了,哈哈哈!
1.ndarray对象
首先ndarray对象包含四部分:

  • 一个指向数组的指针
  • 数据类型或dtype
  • 表示数组形状(shape)的元组
  • 一个跨度元组(跨度貌似是步长之类的东西,比如一个list a,求a[::2]隔一步选一个
    在这里插入图片描述
    2.一些高级操作
#数组重塑
import numpy as np
arr = np.arange(8)
arr
# array([0, 1, 2, 3, 4, 5, 6, 7])
arr.reshape((4,2))  #在reshape函数中传入新的arr的shape元组,就可以进行转换 注意尽管转换了不同的形状,shape表示的参数个数还是要相等 4x2 = 8
# array([[0, 1],
#        [2, 3],
#        [4, 5],
#        [6, 7]])
arr  #但是原来的数组还没变
# array([0, 1, 2, 3, 4, 5, 6, 7])
# 如果你也不知道维度的大小怎么搞 就使用-1 让系统帮你算
arr.reshape((5,-1))  #但是只能有一个-1
arr2 = arr.reshape((4,2))
arr2.ravel()  #将原来的多维数组抻平,称为扁平化
# array([0, 1, 2, 3, 4, 5, 6, 7])
arr2.flatten()  #功能和ravel差不多
# array([0, 1, 2, 3, 4, 5, 6, 7])

#数组的合并和拆分
arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.array([[7,8,9],[10,11,12]])
np.concatenate([arr1,arr2],axis = 0)   #就是上下铺(这里可不可以理解为往第一个[]里放,那肯定是这样的结果啊)
np.vstack((arr1,arr2))  #同样的结果
# array([[ 1,  2,  3],
#        [ 4,  5,  6],
#        [ 7,  8,  9],
#        [10, 11, 12]])
np.concatenate([arr1,arr2],axis = 1)  #按列的方向,左右铺(可以理解为往第二层[]里放,一一对应输出)
np.hstack((arr1,arr2))
# array([[ 1,  2,  3,  7,  8,  9],
#        [ 4,  5,  6, 10, 11, 12]])

#数组的拆分
arr3 = np.vstack((arr1,arr2))
one,two,three = np.split(arr3,[1,3])  #可以想成在1行和3行之前划一下,拆分(注意还有0行)
one
# array([[1, 2, 3]])
two
# array([[4, 5, 6],
#        [7, 8, 9]])
three
# array([[10, 11, 12]])

#数组的重复
arr = np.arange(3)
arr.repeat(3)  #每个元素重复一定次数 都重复三次
# array([0, 0, 0, 1, 1, 1, 2, 2, 2]) 
arr.repeat([1,2,3])  #分别重复对应的次数
# 多维数组还可以按照不同的轴进行重复
arr.repeat(3,axis = 0)
# tile可以看作是数组整体的重复,左右重复
np.tile(arr,2)
# array([0, 1, 2, 0, 1, 2])
#如果第二个参数是元组,可以看作沿着哪条轴的方向重复几次
np.tile(arr,(2,1))
array([[0, 1, 2],
       [0, 1, 2]])

# 花式索引
arr = np.arange(10)*100
inds = [7,1,2,6]
arr.take(inds) #选取inds对应的索引位置上的元素,返回子集
# array([700, 100, 200, 600])
arr.put(inds,42)  #在对应索引位置上更新新的元素
arr
# array([  0,  42,  42, 300, 400, 500,  42,  42, 800, 900])
# 如果是多维数组,加个axis参数就可以指定轴选取
inds = [2,0,2,1]
arr = np.random.randn(2,4)
arr
# array([[ 0.14271255, -0.63509595, -1.62136848, -2.48950018],
#        [ 0.60075197,  0.61550433, -1.54987564, -1.86085921]])
arr.take(inds,axis = 1)
# array([[-1.62136848,  0.14271255, -1.62136848, -0.63509595],
#        [-1.54987564,  0.60075197, -1.54987564,  0.61550433]])
#put不接受在不同的axis上进行索引(书上写的,不知道更新没)

2.广播
不同形状的数组之间的算术运算的执行方式
在广播的时候一般会为了成功广播添加一个添加一个长度为1的新轴,用reshape有点麻烦,因此有新的思路。
通过特殊的np.newaxis来模拟新的长度为1的新轴。
在这里插入图片描述
通过广播设定数组的值:

arr = np.zeros((4,3))
arr[:] = 5 #标量的话一般光波到全局
arr
# array([[5., 5., 5.],
#        [5., 5., 5.],
#        [5., 5., 5.],
#        [5., 5., 5.]])
col = np.array([1,2,3,4])
arr[:] = col[:,np.newaxis]
# arr
# array([[1., 1., 1.],
#        [2., 2., 2.],
#        [3., 3., 3.],
#        [4., 4., 4.]])
arr[:2] = [[23],[45]] #广播了前两行
arr
# array([[23., 23., 23.],
#        [45., 45., 45.],
#        [ 3.,  3.,  3.],
#        [ 4.,  4.,  4.]])

3.ufunc示例方法

# 对数组中各个元素进行求和
np.add.reduce(arr)  # arr.sum()
# 累加
np.add.accumlate(arr,axis = 1)  
# 叉积
np.multi.outer(arr1,arr2)
# 自定义ufunc
np.frompyfunc(my_ufunc,2,1)  #2,1是自定义ufunc函数的参数

4.排序

arr.sort()  #就地排序,不产生新数组
np.sort(arr) #会创建一个新的副本
#间接排序
indexer = values.argsort()
indexer  #返回的是排序后的元素对应的原来的索引
values[indexer]  #就是排好序的元素l数组了

np.lexsort((first_name,second_name))   #多个关键字进行排序 但是没看懂 下面附图

#在有序数组中查找元素
np.searchsorted(9)  #返回该插入的位置或者等于这个值的左侧元素的索引

差不多到这了 大脑缺氧了 溜了溜了

让我无耻地喊出:完结撒花!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值