Numpy中的广播和数组运算

13825820-65f766ec1a9e04b3.jpg
image

一、概述

在Numpy中当数组进行运算时,如果两个数组的形状相同,那么两个数组相乘就是两个数组的对应位相乘,这是要求维数相乘,并且各维度的长度相同,但是当运算中两个数组的形状不同使时,numpy将会自动触发广播机制,所以我们要了解numpy的广播机制,才能更好的进行数组的运算。

二、Numpy中的广播

1、什么是广播

我们都知道,Numpy中的基本运算(加、减、乘、除、求余等等)都是元素级别的,但是这仅仅局限于两个数组的形状相同的情况下。

可是大家又会发现,如果让一个数组加1的话,结果时整个数组的结果都会加1,这是什么情况呢?

13825820-f1d4946438bba284.jpg
image
13825820-a17785a7a1a8ece1.jpg
image
13825820-a427d015a92e959d.jpg
image
13825820-a1207b46e228bf0a.jpg
image
13825820-c824ec42d4e8bc19.jpg
image
13825820-4f5c4a6769ac9019.jpg
image

其实这就是广播机制:Numpy 可以转换这些形状不同的数组,使它们都具有相同的大小,然后再对它们进行运算。下面是广播示意图:

13825820-bfbff7a2219e25ed.jpg
image

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

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

如果满足以下条件之一,那么数组被称为可广播的。

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

广播的规则:

  • 规则 1:如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补 1。
  • 规则 2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度 为 1 的维度扩展以匹配另外一个数组的形状。
  • 规则 3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于 1, 那么会引发异常。

1.1、形状相同的广播

13825820-f16c348f955528c6.jpg
image

1.2、相同维度,但其中某一个或多个维度长度为 1 的广播:

13825820-1a775bf66e15ae21.jpg
image

1.3、较少的维度,默认在其前面追加长度为 1 的维度:

13825820-09efdd83f5235a56.jpg
image

1.4、如果是标量的话,会广播整个数组上:

13825820-b1e5b4764a99e7f4.jpg
image

2、广播示例

2.1、将数组赋值给a并查看数组的形状

13825820-b63e96727ce796d6.jpg
image

2.2、将数组赋值给b并查看数组的形状

13825820-c51b2e7905454165.jpg
image

2.3、将数组a转换为4行1列

13825820-aa4430ae5aae6767.jpg
image

2.4、数组a+b,并查看形状

13825820-d30d26b7d53eba9c.jpg
image
13825820-3c858c9916997b1f.jpg
image

明显可以看出,相加前 a 的形状为 (4, 1), b 的形状为 (3, ), a+b 的结果的形状为(4, 3)。计算时,变换结果与上图类似,这里来详细介绍下:

13825820-a60ba3695eef1bfb.jpg
image

2.5、现在尝试模拟一个广播的方式, 把a中的每个元素拉长三倍

13825820-8228aede58ba4ef6.jpg
image

2.6、b 中的元素拉长4倍

13825820-f5c416e44caef641.jpg
image

2.7、aa+bb

13825820-8f3af598b39dc39d.jpg
image

2.8、a+b

13825820-ca2636febd134713.jpg
image

这里我们就能看出,我们将数组扩展到较大的维度再进行通用函数操作,和我们直接进行广播操作结果是一样的。

三、Numpy中的运算

1、算术运算

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

常用数学运算函数:

数学运算函数

add(x1,x2 )

按元素添加参数,等效于 x1 + x2

subtract(x1,x2)

按元素方式减去参数,等效于x1 - x2

multiply(x1,x2)

逐元素乘法参数,等效于x1 * x2

divide(x1,x2)

逐元素除以参数,等效于x1 / x2

exp(x)

计算e的x次方。

exp2(x)

计算2的x次方。

power(x1,x2)

计算x1的x2次幂。

mod(x)

返回输入数组中相应元素的除法余数.

log(x)

自然对数,逐元素。

log2(x)

x的基础2对数。

log10(x)

以元素为单位返回输入数组的基数10的对数。

expm1(x)

对数组中的所有元素计算exp(x) - 1

log1p(x)

返回一个加自然对数的输入数组。

sqrt(x)

按元素方式返回数组的正平方根。

square(x)

返回输入的元素平方。

sin(x)

三角正弦。

cos(x)

元素余弦。

tan(x)

逐元素计算切线。

1.1、生成一个3行3列元素类型为浮点型的数组和一个1行3列的数组

13825820-0bdbe3d749bffd41.jpg
image

1.2、执行数组加法

13825820-6ea316e48ced515c.jpg
image

1.3、执行数组减法

13825820-981be0b7a1d57442.jpg
image

1.4、执行数组的乘法

13825820-90cf65dca5440a9f.jpg
image

1.5、执行数组的除法

13825820-f8a2384100e8e7b6.jpg
image

1.6、numpy.reciprocal()

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

13825820-0fb44c654a6088b2.jpg
image

1.7、进行指数运算

13825820-4408f2f80d4847c8.jpg
image

1.8、执行幂运算

13825820-42e1bf3145cd5dfc.jpg
image

1.9、numpy.mod()

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

13825820-3ff488a29f0605ba.jpg
image

1.10、对含有复数的数组进行执行的函数

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

1.11、执行三角函数

13825820-7675fb351556498f.jpg
image
  1. 补充
  • numpy.around()

这个函数返回四舍五入到所需精度的值。decimals 表示要舍入的小数位数。默认值为 0。如果 为负,整数将四舍五入到小数点左侧的位置

13825820-01053b74065a0921.jpg
image

同pyhon内置一样,在进行舍入的时候需要注意二进制小数的精度问题

13825820-a45ed501d4699ad8.jpg
image
  • numpy.floor() 向下取整

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

13825820-7130064adb0d510e.jpg
image
  • numpy.ceil()向上取整

本函数返回输入值的上限,即,标量 x 的上限是最小的整数 i ,使得 i> = x。

13825820-d5c46b2ca6ec8b0c.jpg
image

2、字符串函数

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

2.1、numpy.char.add()

函数执行按元素的字符串连接:

13825820-7b601a2600ce2d66.jpg
image

2.2、numpy.char.multiply()

这个函数执行多重连接:

13825820-6f6ad455c3cd41c4.jpg
image

2.3、numpy.char.center()

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

13825820-d75483c0c986f403.jpg
image

2.4、numpy.char.capitalize()

函数返回字符串的副本,其中第一个字母大写:

13825820-20077deee4d660d1.jpg
image

2.5、numpy.char.title()

返回输入字符串的按元素标题转换版本,其中每个单词的首字母都大写:

13825820-815a1d57ee56a5a2.jpg
image

2.6、numpy.char.lower()

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

13825820-53186fc3c27c49c6.jpg
image

2.7、numpy.char.upper()

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

13825820-96a69f712d0839c7.jpg
image

2.8、numpy.char.split()

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

13825820-b26a7eeafd38e300.jpg
image

2.9、numpy.char.splitlines()

函数返回数组中元素的单词列表,以换行符分割:'\n','\r','\r\n' 都被当做换行符处理。

13825820-261a72495b20de93.jpg
image

2.10、numpy.char.strip()

函数返回数组的副本,其中元素移除了开头或结尾处的特定字符:

13825820-28ea4e2fc29a01a8.jpg
image

2.11、numpy.char.join()

这个函数返回一个字符串,其中单个字符由特定的分隔符连接:

13825820-e230c1ea63b84717.jpg
image

2.12、numpy.char.replace()

这个函数返回字符串副本,其中所有字符序列的出现位置都被另一个给定的字符序列取代:

13825820-539c6526498cad1e.jpg
image

3、统计函数

NumPy有很多有用的统计函数,用于从数组中给定的元素中查找最小,最大,百分标准差和方差等。

常用统计函数

numpy.amin()

从给定数组中的元素沿指定轴返回最小值

numpy.amax()

从给定数组中的元素沿指定轴返回最大值

numpy.ptp()

返回沿轴的值的极差(最大值 - 最小值)

numpy.percentile()

返回特定轴的百分位数

numpy.median()

返回数组中值

numpy.mean()

返回数组的算术平均值

numpy.average()

返回数组的加权平均值

numpy.std()

返回数组的标准差

numpy.var()

返回数组的方差

3.1、numpy.amin() 和 numpy.amax()

这些函数从给定数组中的元素沿指定轴返回最小值和最大值。

13825820-2e2062a62b74460d.jpg
image

3.3、numpy.ptp()

本函数返回沿轴的值的极差(最大值 - 最小值)。

13825820-343aba6a2b543c8b.jpg
image

3.4、numpy.percentile()

百分位数是统计中使用的度量,表示小于这个值得观察值占某个百分比。函数numpy.percentile() 接受以下参数。

numpy.percentile(a, q, axis):

  • a 输入数组
  • q 要计算的百分位数,在 0 ~ 100 之间
  • axis 沿着它计算百分位数的轴
13825820-b7f95acfade37508.jpg
image

3.5、numpy.median()

中值定义为将数据样本的上半部分与下半部分分开的值。

13825820-a216468d9f31e71c.jpg
image

3.6、numpy.mean()

算术平均值是沿轴的元素的总和除以元素的数量。函数返回数组中元素的算术平均值。如果提供了轴,则沿其计算。

13825820-711384c6044e48f3.jpg
image

3.7、numpy.average()

加权平均值是由每个分量乘以反映其重要性的因子得到的平均值。函数根据在另一个数组中给出的各自的权重计算数组中元素的加权平均值。该函数可以接受一个轴参数。如果没有指定轴,则数组会被展开。

考虑数组 [1,2,3,4] 和相应的权重 [4,3,2,1] ,通过将相应元素的乘积相加,并将和除以权重的和,来计算加权平均值。

加权平均值 = (14+23+32+41)/(4+3+2+1)

13825820-2ba67375ec67867d.jpg
image

不指定权重时相当于mean函数

13825820-f853af24c43211a9.jpg
image
13825820-f5d2213a0c55f9c0.jpg
image

如果returned参数设为true,则返回权重的和

13825820-39bd18c5bf3e6c17.jpg
image

3.8、numpy.std()

标准差是与均值的偏差的平方的平均值的平方根。标准差公式如下: std = sqrt(mean((x - x.mean())**2))

13825820-7e804bf0cd1829df.jpg
image

方差是偏差的平方的平均值,即mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。

13825820-d543801b9577152f.jpg
image

4、排序、搜索和计数函数

4.1、numpy.sort()函数返回输入数组的排序副本。

13825820-414f9a5d6bd7ea84.jpg
image
13825820-df357acc292c90e7.jpg
image

4.2、numpy.argsort()

函数对输入数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组。这个索引 数组用于构造排序后的数组。

13825820-7f059b14fd44b2bc.jpg
image

4.3、numpy.lexsort()

函数使用键序列执行间接排序。键可以看作是电子表格中的一列。该函数返回一个索引数组,使用它可以获得排序数据。注意,最后一个键恰好是 sort 的主键。

13825820-2b49f39b9098fdfd.jpg
image

4.4、numpy.argmax() 和 numpy.argmin()

这两个函数分别沿给定轴返回最大和最小元素的索引

13825820-e2069c6f9a94b428.jpg
image

4.5、numpy.nonzero()

函数返回输入数组中非零元素的索引。

13825820-da16f610ae19599b.jpg
image

4.6、numpy.where()

函数返回输入数组中满足给定条件的元素的索引。

13825820-9cd2c1522dcbe23a.jpg
image

4.7、numpy.extract()

函数返回满足任何条件的元素。

13825820-ccdc7c154d792432.jpg
image

5、转置

Numpy 的转置可以按照你的需要对数组的轴进行转换。

13825820-44381234672e6334.jpg
image

需要注意的是,转置只能发生在二维及以上的维度的数组上生效,一维的数组只有一个维度是 不可以转置的。

13825820-35c9f03a8f126882.jpg
image

6、唯一化和集合逻辑

  • np.unique() 去重函数
  • np.in1d() 验证元素是否在给定序列中
  • np.intersect1d() 求交集
  • np.union1d() 求并集
  • np.setdiff1d() 求差集

6.1去重

  • 字符串去重
13825820-49e14e272ab26372.jpg
image
  • 整数去重
13825820-68cb9eef8601a267.jpg
image
  • 布尔值去重
13825820-9790d0869419c37f.jpg
image
  • 布尔值的any()和all()函数
13825820-ec72082cc732f259.jpg
image

6.2、检验元素

13825820-46e25299d8755516.jpg
image

6.3、求交集

13825820-c40d2563602b9e1b.jpg
image

6.4、求并集

13825820-98e3655d087b66a4.jpg
image

6.5、求差集

13825820-c9196858bc684ca5.jpg
image
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值