numpy数组03-数组的计算

本文介绍了numpy中数组与数字以及数组间进行四则运算的规则,包括广播机制、相同形状数组的运算、以及不同形状数组在特定条件下的处理。特别提到0/0和非零数/0的结果。

一.数组与数字之间进行计算

numpy中的数组与数字进行计算是广播形式,数组+-*/数字,则数组中的每一个数字都会进行相应的四则运算。

1.1数组与数字之间的四则运算

示例代码如下:

import numpy as np


a = np.arange(24)
b = a.reshape(4, 6)
print(b)
print(b+2)
print(b-2)
print(b*2)
print(b/2)

输出结果如下所示:

可以发现数组中的每一个数字有进行了运算。

1.2数组/0的运算(运行时程序会警告,但是不会报错)

示例代码如下:

import numpy as np


a = np.arange(24)
b = a.reshape(4, 6)
print(b)
print(b/0)

输出结果如下:

 其中nan是0/0的结果

inf是非零数字/0的结果,inf为infinitely的缩写,表示无穷大。

二、数组与数字之间的运算

2.1 两个数组形状相同

当两个数组的形状一样的时候,四则运算对应的位置的数字进行操作。

示例代码如下:

b = np.arange(24).reshape(4, 6)
c = np.arange(100, 124).reshape(4, 6)
print(b)
print("------")
print(c)

print(b+c)
print(b-c)
print(b*c)
print(b/c)

输出结果如下:

 结果为直接对应的数据进行运算。

2.2 当两个数组的形状不相同

2.2.1 若两个数组的列相同

则按照每一行的数据进行相加

示例代码如下:

b = np.arange(24).reshape(4, 6)  # 4*6
s = np.arange(0, 6)              # 1*6
print(b)
print(s)
print(b+s)  # b的每一行加上s对应的数

输出结果如下:

2.2.2 若两个数组的行相同

则按照每列进行多次相加

示例代码如下:

j = np.arange(4).reshape(4, 1)
b = np.arange(24).reshape(4, 6)
print(j)
print(b+j)

输出结果如下所示:

注意点:

三维数组只能在某一维度(某一方向)上中的行和列都一样,才能进行运算。

若行的维度和列的维度都不一样,则不能进行运算。

例如:

shape为(3,3,3)的数组不能与(3,2)进行计算。

shape为(3,3,3)的数组能与(3,3)进行计算。

### 使用 NumPy 计算两个数组之间的欧几里得距离 计算两个 NumPy 数组之间的欧几里得距离可以通过多种方式实现。以下是几种常见的方法: #### 方法一:使用平方的开方公式 通过手动计算平方差的并取平方根,可以得到两个数组之间的欧几里得距离。这种方法直观且易于理解。 ```python import numpy as np def euclid_distance(x1, x2): """计算欧几里得距离""" distance = np.sqrt(np.sum((x1 - x2) ** 2)) # 计算平方差的并取平方根 return distance ``` 此方法适用于两个相同维度的数组[^1]。 #### 方法二:使用 `np.linalg.norm` NumPy 提供了内置函 `np.linalg.norm`,可以直接用于计算向量或矩阵的范。在二维空间中,L2等价于欧几里得距离。 ```python import numpy as np def euclid_distance_norm(x1, x2): """使用 np.linalg.norm 计算欧几里得距离""" distance = np.linalg.norm(x1 - x2) # 计算 L2 return distance ``` 这种方法更为简洁,并且性能较好[^5]。 #### 方法三:广播机制计算多点间的距离矩阵 如果需要计算多个点之间的两两欧几里得距离,可以利用 NumPy 的广播机制。以下代码展示了如何生成一个距离矩阵: ```python import numpy as np def euclidean_distance_matrix(A, B): """计算两个数组中所有点之间的欧式距离矩阵""" distance_matrix = np.sqrt(np.sum((A[:, np.newaxis, :] - B[np.newaxis, :, :]) ** 2, axis=-1)) return distance_matrix ``` 此方法适合处理大规模据集,但需要注意其时间复杂度较高[^3]。 ### 示例代码 以下是一个完整的示例,展示如何使用上述方法计算两个 NumPy 数组之间的欧几里得距离: ```python import numpy as np # 定义两个数组 x1 = np.array([1, 2, 3]) x2 = np.array([4, 5, 6]) # 方法一 distance1 = np.sqrt(np.sum((x1 - x2) ** 2)) print(f"方法一结果: {distance1}") # 输出: 方法一结果: 5.196152422706632 # 方法二 distance2 = np.linalg.norm(x1 - x2) print(f"方法二结果: {distance2}") # 输出: 方法二结果: 5.196152422706632 # 如果需要计算多点间距离矩阵 A = np.random.rand(3, 2) # 32维点 B = np.random.rand(4, 2) # 4 个 2维点 distance_matrix = np.sqrt(np.sum((A[:, np.newaxis, :] - B[np.newaxis, :, :]) ** 2, axis=-1)) print("距离矩阵:") print(distance_matrix) ``` ### 注意事项 - 确保输入的两个数组具有相同的维度,否则会引发形状不匹配的错误。 - 对于大规模据集,广播机制可能会消耗大量内存,需谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一道秘制的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值