十一章是金融方面应用,因为我不学无术,所以就不写了。
终于最后一章了,哈哈哈!
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) #返回该插入的位置或者等于这个值的左侧元素的索引
差不多到这了 大脑缺氧了 溜了溜了
让我无耻地喊出:完结撒花!!!!