Numpy 元素逐个除法未按预期工作
根据文档,这里是元素之间的除法是如何正常工作的。
a1 = np.array([8,12,14])
b1 = np.array([4,6,7])
a1/b1
array([2, 2, 2])
这个是可以正常工作的。我在不同的数组上尝试做同样的事情,但结果却不一样。对于两个三维向量,它返回的是一个3x3的矩阵。我甚至确保它们的“形状是相同的”,但结果还是没有变化。
>> t
array([[ 3.17021277e+00],
[ 4.45795858e-15],
[ 7.52842809e-01]])
>> s
array([ 1.00000000e+00, 7.86202619e+02, 7.52842809e-01])
>> t/s
array([[ 3.17021277e+00, 4.03231011e-03, 4.21098897e+00],
[ 4.45795858e-15, 5.67024132e-18, 5.92149984e-15],
[ 7.52842809e-01, 9.57568432e-04, 1.00000000e+00]])
t/s.T
array([[ 3.17021277e+00, 4.03231011e-03, 4.21098897e+00],
[ 4.45795858e-15, 5.67024132e-18, 5.92149984e-15],
[ 7.52842809e-01, 9.57568432e-04, 1.00000000e+00]])
1 个回答
14
这是因为你两个数组的形状不同,t的形状是(3,1),而s的形状是(3,)。根据广播规则,如果两个维度相等,就逐个元素进行操作;如果不相等,操作会失败,除非其中一个维度是1。在这种情况下,维度为1的数组会对另一个数组的所有元素进行操作。
我猜你想做的事情是:
t[:,0] / s
或者
np.squeeze(t) / s
这两种方法都能去掉t中多余的第一维。这其实不是个bug,而是个特性!因为如果你有两个向量,想要对它们的所有元素进行操作,你就是这样做的:
a = np.arange(3)
b = np.arange(3)
逐个元素你现在可以这样做:
a*b = [0,1,4]
如果你想对所有元素进行操作,可以像这样插入大小为1的维度:
a[np.newaxis,:] * b[:,np.newaxis]
试试看!这个概念真的很方便,虽然一开始可能会让人感到困惑。