Numpy 在指定轴上将ndarray数组与1d数组相乘
当我们需要在NumPy中将ndarray数组与1d数组相乘时,有许多方法可以实现。在本文中,我们将介绍如何使用NumPy在指定轴上将这两个对象相乘,并提供实际的示例以更好地说明这一点。
阅读更多:Numpy 教程
为什么要在指定轴上相乘?
使用NumPy相乘是非常常见的,但是有时候我们需要将ndarray数组与1d数组相乘,而在某些轴上相乘。这可能发生在数据处理之前,我们需要将矩阵与向量相乘。例如,我们可以用以下方式计算两个矩阵(2×3)和(3×1)的乘积:
import numpy as np
matrix = np.array([[1,2,3], [4,5,6]])
vector = np.array([1,2,3]).reshape(3,1)
result = np.dot(matrix, vector)
这里我们reshape了vector以使其变成一个3×1的矩阵。但是,这只是一个简单的示例。 在实际情况下,如果我们有一个大的数据集,我们需要找出更普遍化的方法。
如何在指定轴上相乘?
在NumPy中,我们有几种方法可以在数组的特定轴上相乘。以下是其中一些示例:
1. np.broadcast_to
该函数用于将数组广播到新形状。 这样可以更轻松地将数组与特定方向进行比较。 np.broadcast_to需要两个输入,一个是有用数据,一个是目标数组的维度。
a = np.arange(6).reshape(2,3)
b = np.array([2, 1, 3])
# axis = 0, 在行的方向上相乘
result = a * np.broadcast_to(b, (2, 3))
print(result)
输出结果:
“` [[ 0 1 6]
[ 6 5 18]]
<pre><code class="line-numbers">这里我们使用broadcast_to方法将向量b广播并乘以矩阵a,同时通过axis = 0参数指定了相乘的维度方向。
### 2. np.multiply
np.multiply可以将ndarray数组与1d数组相乘。 我们可以通过指定数组的axis参数来选择在哪个轴上执行操作。
“`python
a = np.arange(6).reshape((2, 3))
b = np.array([2, 1, 3]).reshape(1, 3)
# axis = 0
result1 = np.multiply(a, b)
# axis = 1
result2 = np.multiply(a, b.T)
print(result1)
print(result2)
结果输出:
[[ 0 1 6]
[ 6 5 18]]
[[ 0 2 6]
[ 0 5 12]]
这里我们使用a和b ndarrays执行相乘。 在result1中,广播的b的第一个轴号为2,第二个轴号为3,则该数组将与a的第一个轴相乘。 在result2中,我们使用b.T属性将其按行广播。这样,我们就可以使用ndarray的第二个轴与b进行乘法。
3. np.diag
还可以使用np.diag将行矩阵转换为对角矩阵,然后将矩阵与一维数组进行乘法。
a = np.array([[2, 1, 3], [4, 5, 6]])
b = np.array([2, 1, 3], dtype=int)
# axis = 0
result1 = np.diag(b) @ a
# axis = 1
result2 = a @ np.diag(b)
print(result1)
print(result2)
结果输出:
[[ 4 1 9]
[12 5 18]]
这里我们使用了矩阵乘法@,并使用np.diag在相应轴上创建了对角矩阵。 在result1中,我们先将b转换为对角矩阵,然后将其与a相乘。 在result2中,我们首先将a与对角矩阵相乘,然后再应用结果。
示例
让我们来看一个更实际的示例,如何使用np.multiply在指定轴上将ndarray数组与1d数组相乘。 假设我们要对存储在3D NDArray中的数据进行移动平均处理,此处展示了在指定轴上乘以移动平均系数的示例。
import numpy as np
# 生成随机数据
data = np.random.random((3, 4, 5))
# 移动平均系数
ma_coeff = np.array([0.1, 0.2, 0.4, 0.2, 0.1])
# 挂钩:计算加权平均值
def weighted_average(a, weights):
return np.sum(a * weights) / np.sum(weights)
# 为了更好的展示,我们输出原始数组中第一个元素移动平均后的结果
result = np.apply_along_axis(lambda x: weighted_average(x, ma_coeff), axis=2, arr=data[0:1,:,:])
print(result)
输出示例:
[[0.47901253 0.49667458 0.51047615 0.55540956]
[0.50098202 0.52838621 0.54607918 0.59094717]
[0.50601264 0.53668286 0.56048968 0.60103655]
[0.51123959 0.55052221 0.57367562 0.61727161]]
我们将data数组切片成一个小数据集,并使用lambda函数将他们应用在指定轴上。 在此示例中,我们计算了3D数组中第一个元素的移动平均值,并将结果打印出来。
总结
在本文中,我们介绍了如何使用NumPy在指定轴上将ndarray数组与1d数组相乘。 我们看了几个示例,包括使用np.broadcast_to, np.multiply以及np.diag等函数,以期鼓励读者更好地理解这个概念并掌握使用方法。
极客笔记