Python数据分析学习笔记:Numpy(二)

2 min read

切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样。如前所述,ndarray对象中的元素遵循基于零的索引。有三种可用的索引方法类型:字段访问,基本切片和高级索引。

基本切片

基本切片是 Python 中基本切片概念到 n 维的扩展。 通过将start,stop和step参数提供给内置的slice函数来构造一个 Python slice对象。此slice对象被传递给数组来提取数组的一部分。

如果只输入一个参数,则将返回与索引对应的单个项目。 如果使用a:,则从该索引向后的所有项目将被提取。 如果使用两个参数(以:分隔),则对两个索引(不包括停止索引)之间的元素以默认步骤进行切片。

示例:

上面的描述也可用于多维ndarray。切片还可以包括省略号(…),来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的ndarray。

示例:

高级索引

如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引ndarray。高级索引始终返回数据的副本。 与此相反,切片只提供了一个视图。有两种类型的高级索引:整数和布尔值。

整数索引

这种机制有助于基于 N 维索引来获取数组中任意元素。 每个整数数组表示该维度的下标值。 当索引的元素个数就是目标ndarray的维度时,会变得相当直接。

行索引包含所有行号,列索引指定要选择的元素。高级和基本索引可以通过使用切片:或省略号…与索引数组组合。 以下示例使用slice作为列索引和高级索引。 当切片用于两者时,结果是相同的。 但高级索引会导致复制,并且可能有不同的内存布局。

示例:

布尔索引

当结果对象是布尔运算(例如比较运算符)的结果时,将使用此类型的高级索引。

示例:

广播

术语广播是指NumPy在算术运算期间处理不同形状的数组的能力。对数组的算术运算通常在相应的元素上进行。如果两个阵列具有完全相同的形状,则这些操作被无缝执行。

示例:

如果两个数组的维数不相同,则元素到元素的操作是不可能的。 然而,在 NumPy 中仍然可以对形状不相似的数组进行操作,因为它拥有广播功能。 较小的数组会广播到较大数组的大小,以便使它们的形状可兼容。如果满足以下规则,可以进行广播:

  • ndim较小的数组会在前面追加一个长度为 1 的维度。
  • 输出数组的每个维度的大小是输入数组该维度大小的最大值。
  • 如果输入在每个维度中的大小与输出大小匹配,或其值正好为 1,则在计算中可它。
  • 如果输入的某个维度大小为 1,则该维度中的第一个数据元素将用于该维度的所有计算。

如果上述规则产生有效结果,并且满足以下条件之一,那么数组被称为可广播的。

  • 数组拥有相同形状。
  • 数组拥有相同的维数,每个维度拥有相同长度,或者长度为 1。
  • 数组拥有极少的维度,可以在其前面追加长度为 1 的维度,使上述条件成立。

示例:

下面的图片展示了数组b如何通过广播来与数组a兼容。

数组上的迭代

NumPy 包包含一个迭代器对象numpy.nditer。 它是一个有效的多维迭代器对象,可以用于在数组上进行迭代。 数组的每个元素可使用 Python 的标准Iterator接口来访问。

迭代的顺序匹配数组的内容布局,而不考虑特定的排序。 这可以通过迭代上述数组的转置来看到。

示例:

迭代顺序

如果相同元素使用 F 风格顺序存储,则迭代器选择以更有效的方式对数组进行迭代。

示例:

修改数组的值

nditer对象有另一个可选参数op_flags。 其默认值为只读,但可以设置为读写或只写模式。 这将允许使用此迭代器修改数组元素。

示例:

外部循环

nditer类的构造器拥有flags参数,它可以接受下列值:

序号 参数及描述
1. c_index 可以跟踪 C 顺序的索引
2. f_index 可以跟踪 Fortran 顺序的索引
3. multi-index 每次迭代可以跟踪一种索引类型
4. external_loop 给出的值是具有多个值的一维数组,而不是零维数组

示例:

广播迭代

如果两个数组是可广播的,nditer组合对象能够同时迭代它们。 假设数组a具有维度 3X4,并且存在维度为 1X4 的另一个数组b,则使用以下类型的迭代器(数组b被广播到a的大小)。

示例:

数组操作

NumPy包中有几个例程用于处理ndarray对象中的元素。 它们可以分为以下类型:

修改形状

序号 形状及描述
1. reshape 不改变数据的条件下修改形状
2. flat 数组上的一维迭代器
3. flatten 返回折叠为一维的数组副本
4. ravel 返回连续的展开数组

numpy.reshape这个函数在不改变数据的条件下修改形状,它接受如下参数:

numpy.reshape(arr, newshape, order=’C’)

其中:

  • arr:要修改形状的数组
  • newshape:整数或者整数数组,新的形状应当兼容原有形状
  • order:’C’为 C 风格顺序,’F’为 F 风格顺序,’A’为保留原顺序。

示例:

numpy.ndarray.flat该函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器。

示例:

numpy.ndarray.flatten该函数返回折叠为一维的数组副本,函数接受下列参数:ndarray.flatten(order=’C’)

其中:order:’C’ – 按行,’F’ – 按列,’A’ – 原顺序,’k’ – 元素在内存中的出现顺序。

示例:

numpy.ravel这个函数返回展开的一维数组,并且按需生成副本。返回的数组和输入数组拥有相同数据类型。这个函数接受两个参数。

numpy.ravel(a, order=’C’)

构造器接受下列参数:order:’C’ – 按行,’F’ – 按列,’A’ – 原顺序,’k’ – 元素在内存中的出现顺序。

示例:

翻转操作

序号 操作及描述
1. transpose 翻转数组的维度
2. ndarray.T 和self.transpose()相同
3. rollaxis 向后滚动指定的轴
4. swapaxes 互换数组的两个轴

numpy.transpose这个函数翻转给定数组的维度。如果可能的话它会返回一个视图。函数接受下列参数:numpy.transpose(arr, axes)

其中:

  • arr:要转置的数组
  • axes:整数的列表,对应维度,通常所有维度都会翻转。

numpy.ndarray.T该函数属于ndarray类,行为类似于numpy.transpose。

示例:

数组的连接

序号 数组及描述
1. concatenate 沿着现存的轴连接数据序列
2. stack 沿着新轴连接数组序列
3. hstack 水平堆叠序列中的数组(列方向)
4. vstack 竖直堆叠序列中的数组(行方向)

numpy.concatenate数组的连接是指连接。 此函数用于沿指定轴连接相同形状的两个或多个数组。 该函数接受以下参数。numpy.concatenate((a1, a2, …), axis)

其中:

  • a1, a2, …:相同类型的数组序列
  • axis:沿着它连接数组的轴,默认为 0

示例:

numpy.stack此函数沿新轴连接数组序列。 此功能添加自 NumPy 版本 1.10.0。 需要提供以下参数。numpy.stack(arrays, axis)

其中:

  • arrays:相同形状的数组序列
  • axis:返回数组中的轴,输入数组沿着它来堆叠

示例:

numpy.hstack numpy.stack函数的变体,通过堆叠来生成水平的单个数组。

示例:

numpy.vstack numpy.stack函数的变体,通过堆叠来生成竖直的单个数组。

示例:

数组分割

序号 数组及操作
1. split 将一个数组分割为多个子数组
2. hsplit 将一个数组水平分割为多个子数组(按列)
3. vsplit 将一个数组竖直分割为多个子数组(按行)

numpy.split 该函数沿特定的轴将数组分割为子数组。函数接受三个参数:numpy.split(ary, indices_or_sections, axis)

其中:

  • ary:被分割的输入数组
  • indices_or_sections:可以是整数,表明要从输入数组创建的,等大小的子数组的数量。 如果此参数是一维数组,则其元素表明要创建新子数组的点。
  • axis:默认为 0

示例:

numpy.hsplit numpy.hsplit是split()函数的特例,其中轴为 1 表示水平分割,无论输入数组的维度是什么。

示例:

numpy.vsplit numpy.vsplit是split()函数的特例,其中轴为 0 表示竖直分割,无论输入数组的维度是什么。下面的例子使之更清楚。

示例:

添加/删除元素

序号 元素及描述
1. resize 返回指定形状的新数组
2. append 将值添加到数组末尾
3. insert 沿指定轴将值插入到指定下标之前
4. delete 返回删掉某个轴的子数组的新数组
5. unique 寻找数组内的唯一元素

numpy.resize此函数返回指定大小的新数组。 如果新大小大于原始大小,则包含原始数组中的元素的重复副本。 该函数接受以下参数。numpy.resize(arr, shape)

其中:

  • arr:要修改大小的输入数组
  • shape:返回数组的新形状

示例:

numpy.append此函数在输入数组的末尾添加值。 附加操作不是原地的,而是分配新的数组。 此外,输入数组的维度必须匹配否则将生成ValueError。

函数接受下列函数:numpy.append(arr, values, axis)

其中:

  • arr:输入数组
  • values:要向arr添加的值,比如和arr形状相同(除了要添加的轴)
  • axis:沿着它完成操作的轴。如果没有提供,两个参数都会被展开。

示例:

numpy.insert此函数在给定索引之前,沿给定轴在输入数组中插入值。 如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开。insert()函数接受以下参数:numpy.insert(arr, obj, values, axis)

其中:

  • arr:输入数组
  • obj:在其之前插入值的索引
  • values:要插入的值
  • axis:沿着它插入的轴,如果未提供,则输入数组会被展开

示例:

numpy.delete 此函数返回从输入数组中删除指定子数组的新数组。 与insert()函数的情况一样,如果未提供轴参数,则输入数组将展开。 该函数接受以下参数:Numpy.delete(arr, obj, axis)

其中:

  • arr:输入数组
  • obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组
  • axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开

示例:

numpy.unique 此函数返回输入数组中的去重元素数组。 该函数能够返回一个元组,包含去重数组和相关索引的数组。 索引的性质取决于函数调用中返回参数的类型。

numpy.unique(arr, return_index, return_inverse, return_counts)

其中:

  • arr:输入数组,如果不是一维数组则会展开
  • return_index:如果为true,返回输入数组中的元素下标
  • return_inverse:如果为true,返回去重数组的下标,它可以用于重构输入数组
  • return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数

示例:

位操作

下面是 NumPy 包中可用的位操作函数。

序号 操作及描述
1. bitwise_and 对数组元素执行位与操作
2. bitwise_or 对数组元素执行位或操作
3. invert 计算位非
4. left_shift 向左移动二进制表示的位
5. right_shift 向右移动二进制表示的位
  • bitwise_and 通过np.bitwise_and()函数对输入数组中的整数的二进制表示的相应位执行位与运算。
  • bitwise_or 通过np.bitwise_or()函数对输入数组中的整数的二进制表示的相应位执行位或运算。

示例:

invert 此函数计算输入数组中整数的位非结果。 对于有符号整数,返回补码。注意,np.binary_repr()函数返回给定宽度中十进制数的二进制表示。

示例:

left_shift numpy.left shift()函数将数组元素的二进制表示中的位向左移动到指定位置,右侧附加相等数量的 0。

right_shift numpy.right_shift()函数将数组元素的二进制表示中的位向右移动到指定位置,左侧附加相等数量的 0。

示例:

字符串函数

以下函数用于对dtype为numpy.string_或numpy.unicode_的数组执行向量化字符串操作。 它们基于 Python 内置库中的标准字符串函数。

序号 函数及描述
1. add() 返回两个str或Unicode数组的逐个字符串连接
2. multiply() 返回按元素多重连接后的字符串
3. center() 返回给定字符串的副本,其中元素位于特定字符串的中央
4. capitalize() 返回给定字符串的副本,其中只有第一个字符串大写
5. title() 返回字符串或 Unicode 的按元素标题转换版本
6. lower() 返回一个数组,其元素转换为小写
7. upper() 返回一个数组,其元素转换为大写
8. split() 返回字符串中的单词列表,并使用分隔符来分割
9. splitlines() 返回元素中的行列表,以换行符分割
10. strip() 返回数组副本,其中元素移除了开头或者结尾处的特定字符
11. join() 返回一个字符串,它是序列中字符串的连接
12. replace() 返回字符串的副本,其中所有子字符串的出现位置都被新字符串取代
13. decode() 按元素调用str.decode
14. encode() 按元素调用str.encode

这些函数在字符数组类(numpy.char)中定义。 较旧的 Numarray 包包含chararray类。 numpy.char类中的上述函数在执行向量化字符串操作时非常有用。

numpy.char.add() 函数执行按元素的字符串连接。

示例:

numpy.char.multiply() 这个函数执行多重连接。

示例:

numpy.char.center() 此函数返回所需宽度的数组,以便输入字符串位于中心,并使用fillchar在左侧和右侧进行填充。

示例:

numpy.char.capitalize() 函数返回字符串的副本,其中第一个字母大写

numpy.char.title() 返回输入字符串的按元素标题转换版本,其中每个单词的首字母都大写。

numpy.char.lower() 函数返回一个数组,其元素转换为小写。它对每个元素调用str.lower。

numpy.char.upper() 函数返回一个数组,其元素转换为大写。它对每个元素调用str.upper。

示例:

numpy.char.split() 此函数返回输入字符串中的单词列表。 默认情况下,空格用作分隔符。 否则,指定的分隔符字符用于分割字符串。

numpy.char.splitlines() 函数返回数组中元素的单词列表,以换行符分割。

示例:

numpy.char.strip() 函数返回数组的副本,其中元素移除了开头或结尾处的特定字符。

示例:

numpy.char.join() 这个函数返回一个字符串,其中单个字符由特定的分隔符连接。

示例:

numpy.char.replace() 这个函数返回字符串副本,其中所有字符序列的出现位置都被另一个给定的字符序列取代。

示例:

numpy.char.decode() 这个函数在给定的字符串中使用特定编码调用str.decode()。

numpy.char.encode() 此函数对数组中的每个元素调用str.encode函数。 默认编码是utf_8,可以使用标准 Python 库中的编解码器。

示例:

算数函数

NumPy 包含大量的各种数学运算功能。 NumPy 提供标准的三角函数,算术运算的函数,复数处理函数等。

三角函数

NumPy 拥有标准的三角函数,它为弧度制单位的给定角度返回三角函数比值。arcsin,arccos,和arctan函数返回给定角度的sin,cos和tan的反三角函数。

示例:

舍入函数

numpy.around() 这个函数返回四舍五入到所需精度的值。该函数接受以下参数:numpy.around(a,decimals)

其中:

序号 参数及描述
1. a 输入数组
2. decimals 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置

示例:

numpy.floor() 此函数返回不大于输入参数的最大整数。 即标量x 的下限是最大的整数i ,使得i <= x。 注意在Python中,向下取整总是从 0 舍入。

numpy.ceil() 此函数返回输入值的上限,即,标量x的上限是最小的整数i ,使得i> = x。

示例:

算数运算

用于执行算术运算(如add(),subtract(),multiply()和divide())的输入数组必须具有相同的形状或符合数组广播规则。

示例:

numpy.reciprocal() 此函数返回参数逐元素的倒数,由于 Python 处理整数除法的方式,对于绝对值大于 1 的整数元素,结果始终为 0, 对于整数 0,则发出溢出警告。

示例:

numpy.power() 此函数将第一个输入数组中的元素作为底数,计算它与第二个输入数组中相应元素的幂。

示例:

numpy.mod() 此函数返回输入数组中相应元素的除法余数。 函数numpy.remainder()也产生相同的结果。

示例:

以下函数用于对含有复数的数组执行操作。

  • real()返回复数类型参数的实部。
  • imag()返回复数类型参数的虚部。
  • conj()返回通过改变虚部的符号而获得的共轭复数。
  • angle()返回复数参数的角度。 函数的参数是degree。 如果为true,返回的角度以角度制来表示,否则为以弧度制来表示。

示例:

未完待续…

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

使用 Scikit-learn 的进行 KNN 分类

最近邻(KNN)是一种非常简单、易于理解、通用性强的机器学习算法,广泛应用于金融、医疗、政治、手写检测、图像识
1 min read

K-近邻算法KNN学习笔记

什么是K-近邻算法? K近邻法(k-nearest neighbor, k-NN)是1967年由Cover T
2 min read

使用Prophet进行时间序列预测

Prophet是Facebook开源的预测工具,相比ARIMA模型,Prophet真的是非常的简单。只要读入两
1 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注