python numpy floor 学Python不疯魔不成活!NumPy的floor函数一出手,数组形状秒变整形,不服来战 上节课, 我们学习了NumPy数组的基础创建, 以及其属性, 这节课, 我们要掌握数组的形状变换, 还有多数组堆叠, 以及数组拆分, 这三大核心操作, 而这些都是数据处理里, 最常用的 “整形” 技巧。一、改变数组的形状数组, 其形状, 是由每个轴之上的元素数量来决定的, 而这个可以借助 .shape 去查看。NumPy 给出了多种多样的方法, 能够灵活地改变数组的形状, 需要留意的是: 除了以下所提到的方法之外, 其余的方法都会返回新的数组, 并且不会改变原来的数组。1. ravel()数组扁平化讲解的内容是, 把那种称为多维数组的东西 “拉直” 转化成一维数组, 并且是按照默认的 “C 风格” 来进行排列的, 这个 “C 风格” 是行优先的排列方式, 也就是位于最右侧的索引变化是最快的, 具体来说就是要先把第一行全部排完, 然后再去排第二行, 依此类推……案例import numpy as np # 模拟3个学生的4门课成绩3行4列 rg np.random.default_rng(2) scores np.floor(10 * rg.random((3, 4))) print(原成绩数组) print(scores) # 扁平化 flattened scores.ravel() print(\n扁平化后) print(flattened)案例解析: 原本的数组为呈现出三行四列样式的成绩表格存在排列, 通过 ravel() 这个操作按照行优先这种方式展开成为长度是十二的一维数组, 然而原本的数组其自身并没有发生改变。2. ()调整数组形状讲解的内容是, 做出这样的操作, 把数组调整成为指定的那种新的形状, 这其中存在一个要求, 要确保总元素的数量是不会发生改变的并且, 在默认的情况下, 也是按照 “C 风格” 去重新排列元素。案例# 将3行4列的成绩数组调整为6行2列 reshaped scores.reshape(6, 2) print(reshape为6行2列) print(reshaped)针对案例进行剖析: 其中总的元素数量是通过三乘以四得出结果为十二, 在处于特定的(6,2)这种情况之后发生变化成为六行二列 , 元素的排列顺序依据行优先的方式再次进行排列 , 然而原来的数组并没有产生改变。3. 数组转置.T讲解内容返回数组的转置行变列列变行不改变原数组。案例print(原数组形状, scores.shape) # 输出 (3, 4) transposed scores.T print(转置后形状, transposed.shape) # 输出 (4, 3) print(\n转置后) print(transposed)对于案例进行分析, 原本是有着三行四列的数组, 经过转置之后, 变成了四行三列, 其行与列完全进行了互换, 而且原数组的状态保持不变。4. ()直接修改原数组形状要讲解的内容是, 和其他情况不一样, 括号里的操作会直接对原本数组自身的形状进行修改, 并且不会有返回的值。案例print(resize前原数组) print(scores) scores.resize((2, 6)) # 直接修改原数组为2行6列 print(\nresize后原数组) print(scores)以案例进行分析, 在调用了 ((2,6)) 之后, 原本数组的形状, 直接就处于被改变的状态了, 并不需要再次去进行赋值操作。5. 中使用 -1 自动计算维度讲解内容: 在特定的时候, 要是把某一个维度设定为 -1, NumPy 会依据总元素的数量自动去计算该维度的大小, 这可被称作是充满便利的懒人神器。案例# 先把数组变回3行4列再用-1自动计算列数 scores.resize((3, 4)) auto_reshaped scores.reshape(3, -1) # 3行列数自动计算 print(自动计算维度后形状, auto_reshaped.shape) # 输出 (3, 4)案例方面的分析, 存在这样的情况, 总元素的数量是12 , 当处于(3,-1)这种情形的时候 , 行数被固定设定为3 , 而列数是通过自动计算得出的 , 具体计算是12除以3就等于4。二、堆叠不同的数组我们能够把多个数组顺着不一样的轴“拼”凑到一块儿, 进而构成更大的数组。1. ()垂直堆叠沿行方向需将数组沿着, 那个被称作第一个轴的方向, 进行堆叠操作, 这个方向是行方向, 并且要求用于堆叠的数组, 除了行这个维度之外, 其他的维度形状是一致的。案例# 模拟两个小组的数学成绩各2行2列 group_a np.floor(10 * rg.random((2, 2))) group_b np.floor(10 * rg.random((2, 2))) print(小组A) print(group_a) print(\n小组B) print(group_b) # 垂直堆叠 vertical np.vstack((group_a, group_b)) print(\n垂直堆叠后) print(vertical)去分析案例: 存在着两个数组, 这两个数组都是二行二列的, 之后呢, 要变成四行二列, 是按照行的方向进行拼接的, 并且列数维持不变。2. ()水平堆叠沿列方向需要进行的操作是, 沿着第二个轴, 也就是列的方向, 去堆叠数组, 并且有要求, 那就是等待堆叠的数组, 除了列这个维度之外, 其他的维度形状得是一致的。案例# 水平堆叠 horizontal np.hstack((group_a, group_b)) print(水平堆叠后) print(horizontal)案例剖析: 存在两个数组, 均为两行两列的状况, 之后转变为两行四列, 是在列的方向进行拼接操作, 并且行数维持不变。3. ()将 1D 数组作为列堆叠成 2D 数组被讲解的内容是, 专门用来对一维数组以 “列” 的形式进行堆叠从而形成二维数组的要是面对的是二维数组, 那么所呈现的效果跟 的情况相类似。案例# 模拟两个一维数组学生的语文和英语成绩 chinese np.array([82., 91., 76.]) english np.array([88., 85., 93.]) # 用column_stack堆叠 col_stack np.column_stack((chinese, english)) print(column_stack堆叠1D数组) print(col_stack) # 对比hstack仅拼接成更长的1D数组 h_stack_1d np.hstack((chinese, english)) print(\nhstack堆叠1D数组) print(h_stack_1d)从案例进行分析, 存在这样两种情况, 一种情况是, 将两个单个维度的数组, 转变成为具有三行两列这种形式的二维数组, 其中每一列对应着一门课程而另一种情况则是, 仅仅是把单个维度的数组, 简易地拼接成为一个长度更长的单个维度的数组。4. r_ 和 c_灵活的数组创建与堆叠以下是改写后的内容: 沿行方向进行堆叠操作的 r_ , 其行为特征类似于已有默认状况展现情形下的那种样式, 沿列方向展开堆叠行为的 c_ , 它也是有着类似于默认呈现状态的表现方式。此外, 这两者还具备借助切片这种操作手段比如说是 1:5 这样的形式来能够迅速地产生数组的能力。案例# 用r_拼接数值和切片 r_array np.r_[2:5, 0, 6:9] print(r_生成的数组) print(r_array) # 输出 [2 3 4 0 6 7 8] # 用c_堆叠一维数组 c_array np.c_[chinese, english] print(\nc_堆叠1D数组) print(c_array)案例分析r_2:5,0,6:9利用快速方式生成连续的数组, 将c_进行操作, 即以特定方式把和当作列来堆叠从而形成二维数组, 其呈现出来的效果跟一致。三、拆分数组跟堆叠形成相反情形的是, 我们能够将一个规模较大的数组, 按照所指定的轴, “拆解”成为多个规模较小的数组。1. ()沿水平轴列方向拆分讲解内容沿列方向拆分数组有两种用法案例# 模拟2行12列的月度销售数据 sales np.floor(10 * rg.random((2, 12))) print(原销售数据) print(sales) # 拆分成3个等份 split_eq np.hsplit(sales, 3) print(\n拆分成3等份后的第一个数组) print(split_eq[0]) # 在第4列和第7列后拆分 split_custom np.hsplit(sales, (4, 7)) print(\n自定义拆分后的第二个数组第5-7列) print(split_custom[1])对于案例分析而言, (sales,3)这种情况, 是要把12列进行拆分, 拆分成3个4列的数组而(sales,(4,7))这种情况, 实际是要从中得到三个数组, 分别是0到3列的数组, 4到6列的数组, 以及7到11列的数组。2. ()沿垂直轴行方向拆分讲解的内容是要按照行的方向去拆分数组, 其用法跟完全一致的那种情况是一样的, 只不过这里的方向是行。案例# 模拟4行3列的库存数据 inventory np.floor(10 * rg.random((4, 3))) print(原库存数据) print(inventory) # 拆分成2个等份 v_split np.vsplit(inventory, 2) print(\n垂直拆分后的第一个数组) print(v_split[0])来进行案例分析, 存在一个四行三列的数组, 要将其拆分成两个等份, 并且每个等份都是两行三列。3. ()沿指定轴灵活拆分用更通用的方法来拆分, 借助 axis 参数去指定拆分的轴, 其中 0 是代表行, 1 代表列, 它支持随便什么维度, 并且在元素数量没办法平均分配的时候会自动进行调整, 不会出现报错这种情况。案例# 沿行轴axis0拆分inventory为2份 split_row np.array_split(inventory, 2, axis0) print(array_split沿行拆分) print(split_row[0]) # 沿列轴axis1拆分sales为5份自动调整宽度 split_col np.array_split(sales, 5, axis1) print(\narray_split沿列拆分后的第一个数组) print(split_col[0])案例剖析: 借由axis灵活地去指定拆分的方向, 就是即便将12列实施拆分成5份这种情况没办法做到均匀分配, 它也会自行按照3列、3列、2列、2列、2列这样的方式来进行分配。小结。这节课我们掌握了对数组形状进行变换时, 有ravel()、()、.T、()以及-1自动维度计算在数组堆叠方面, 涵盖()、()、()以及灵活的r_/c_而数组拆分则包含()、()还有通用的()。