文章数据
收藏(次)
【python数据分析】附录
附录 A NumPy 高级应用
--------------------------------------------------------------------------------
ndarray内部由以下内容组成:
1、一个指向数据(内存或内存映射文件中的一块数据)的指针。
2、数据类型或dtype,描述在数组中的固定大小值的格子。
3、一个表示数组形状(shape)的元组。
4、一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要“跨过”的字节数。
--------------------------------------------------------------------------------
np.ones((10, 5)).shape 形状是 10 * 5 的矩阵(二维数组)
--------------------------------------------------------------------------------
np.ones((3, 4, 5), dtype=np.float64).strides 输出:(160,40,8)
这个是三维数组,类型是float64, float64占空间 8 个字节
上面的三维数组是这样的, [ 4*5的二维数组1,4*5的二维数组2, 4*5的二维数组3 ]
从1到2需要跨越一个二维4*5的数组, 也就是 4*5*8=160 个字节
在一维数组上从当前数据到下一个数据就是跨越一个 float64 数据,即 8 字节
--------------------------------------------------------------------------------
虽然NumPy用户很少会对数组的跨度信息感兴趣,但它们却是构建非复制式数组视
图的重要因素。跨度甚至可以是负数,这样会使数组在内存中后向移动,比如在切
片obj[::-1]或obj[:,::-1]中就是这样的。
--------------------------------------------------------------------------------
NumPy数据类型体系:
创建 numpy 数组的时候如果没有指定数据类型,那么他会推断一个合适的类型,比如
把数据推断成 int8, int16, int32, int64 等这样的小类,这时我们可能不关心是intN,
而是关心他是不是 int类型,如果是就能进行整数的运算。
--------------------------------------------------------------------------------
i8 = np.ones(10, dtype=np.int8)
np.issubdtype(i8.dtype, np.integer) # 数据类型是不是这个类型的子类
输出:True
np.int16.mro() 输出:查看其所有的父类
[numpy.int16,
numpy.signedinteger,
numpy.integer,
numpy.number,
numpy.generic,
object]
================================================================================
数组重塑: reshape ravel flatten
--------------------------------------------------------------------------------
多数情况下,你可以无需复制任何数据,就将数组从一个形状转换为另一个形状。
只需向数组的实例方法reshape传入一个表示新形状的元组即可实现该目的
arr.reshape((4, 2)).reshape((2, 4)) # 多维数组也能重塑
arr = np.arange(15)
arr.reshape((5, -1)) # 重塑,给定一个参数, 使用-1,让他自己推断另一个参数
--------------------------------------------------------------------------------
与reshape将一维数组转换为多维数组的运算过程相反的运算通常称为扁平化(flattening)或散开(raveling)
多维数组变成一维数组
arr = np.arange(10).reshape(2,-1)
arr.ravel() # 输出 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
--------------------------------------------------------------------------------
arr.flatten() # 和 ravel 功能一致,总是产生数据副本
# 而 如果结果中的值与原始数组相同,ravel不会产生源数据的副本
--------------------------------------------------------------------------------
上面把数据扁平化的时候,总是行优先,一行接着一行,那么能不能是,列优先呢,一列接着一列
arr.ravel('F') 输出: array([0, 5, 1, 6, 2, 7, 3, 8, 4, 9])
--------------------------------------------------------------------------------
同样的,reshape 的时候是先排序一行,然后,下一行,能不能先排一列,然后下一列呢
arr = np.arange(10).reshape(2,-1, order='F')
arr 输出:
array([[0, 2, 4, 6, 8],
[1, 3, 5, 7, 9]])
--------------------------------------------------------------------------------
order 参数是 'C', 'F', 默认是'C', 行优先。
C 表示 C 风格编程, 行优先
F 表示 Fortran 风格编程,他是列优先
--------------------------------------------------------------------------------
数组的合并和拆分
--------------------------------------------------------------------------------
numpy.concatenate可以按指定轴将一个由数组组成的序列(如元组、列表等)连接到一起
--------------------------------------------------------------------------------
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.concatenate([arr1, arr2], axis=1) # 在行上拼接 要求行数是相同的
np.vstack((arr1, arr2)) # vertical 垂直方向叠起来
np.hstack((arr1, arr2)) # 水平方向, horizontal
--------------------------------------------------------------------------------
split用于将一个数组沿指定轴拆分为多个数组
arr = np.random.randn(5, 2)
first, second, third = np.split(arr, [1, 2]) # 在指定位置把数组切分
--------------------------------------------------------------------------------
arr = np.random.randn(5, 5)
first, second, third = np.split(arr, [1, 2], axis=1) # 列上切
--------------------------------------------------------------------------------
方法汇总:
concatenate
vstack row_stack
hstack
column_stack
dstack axis=2 三维才有吧
split
hsplit, vsplit, dsplit 相当于 split(.. axis = 0,1,2)
--------------------------------------------------------------------------------
NumPy命名空间中有两个特殊的对象——r和c
--------------------------------------------------------------------------------
np.r_[arr1, arr2] # np.r_[] 行数拼接数据
np.c_[np.r_[arr1, arr2], arr] # np.c_[] 列上拼接
np.c_[1:6, -10:-5] # 生成 一个数组
--------------------------------------------------------------------------------
arr = np.arange(3)
arr.repeat(3) # 给每个位置上的元素重复N次
arr.repeat([2,3,4]) # 第一个位置重重2,第二个位置重复3次,第三个元素重复4次
--------------------------------------------------------------------------------
arr.repeat([2, 3], axis=0) 按照某个轴上进行重复
tile的功能是沿指定轴向堆叠数组的副本,像贴瓷砖一样
np.tile(arr, 2) # 第二个参数是瓷砖的数量
--------------------------------------------------------------------------------
花式索引的等价函数:take和put
take 获取指定位置的 数据
put 设置指定位置的数据
还有 axis 的
--------------------------------------------------------------------------------
广播:
广播(broadcasting)指的是不同形状的数组之间的算术运算的执行方式
一个向量(数组) 和一个标量运算,会发生广播,标量和向量的每个元素都运算依次
一个二维数组和一个一维数组运算,发生广播,一维数组在和二维数组的每一行(或是列)计算一次
二维数组和三维数组的运算,二维数组会和三维数组的每个面运算一次。
也就是说不同维度的数据运算时发生广播,
高维度数据会先降维成N个低纬度的数据,然后N的低纬度的数据挨个的和另一个(低纬度,且同型的)数据运算
================================================================================
ufunc高级应用
--------------------------------------------------------------------------------
np.add.reduce(arr) # add 是指加法运算,reduce 让多个数据变成一个数据
np.add.accumulate # accumulate 累加,相当于 sum
np.multiply.outer # 交叉相乘
reduce
accumulate
reduceat
outer(x,y)
--------------------------------------------------------------------------------
有关排序的话题
间接排序:argsort和lexsort
--------------------------------------------------------------------------------
排序的目的之一可能是确定数组中最大或最小的元素。NumPy有两个优化方法,
numpy.partition和np.argpartition,可以在第k个最小元素划分的数组:
--------------------------------------------------------------------------------
numpy.searchsorted
--------------------------------------------------------------------------------
内存映像文件
np.memmap('mymmap', dtype='float64', mode='w+', shape=(10000, 10000))
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
分享
收藏
点赞人
举报
文章标签
评论列表