python - Numpy 元素明智的除法没有按预期工作

标签 python numpy

根据文档,这是元素划分的正常工作方式

a1 = np.array([8,12,14])
b1 = np.array([4,6,7])
a1/b1
array([2, 2, 2])

哪个有效。我想,我在不同的阵列上尝试同样的事情,但事实并非如此。对于两个 3 维向量,它返回一个 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]])

最佳答案

这是因为你的两个数组的形状是 t.shape = (3,1) 和 s.shape=(3,)。所以广播规则适用:他们声明如果两个维度相等,则按元素进行,如果它们不相同,它将失败,除非其中一个是一个,这就是它变得有趣的地方:在这种情况下维度为一的数组将对另一维度的所有元素迭代操作。

我猜你想做的是

t[:,0] / s

np.squeeze(t) / s

两者都会去掉 t 中空的第一个维度。这真的不是一个错误,而是一个功能!因为如果你有两个向量并且你想在所有元素之间做一个操作,你就可以这样做:

a = np.arange(3)
b = np.arange(3)

你现在可以在元素方面做:

a*b = [0,1,4]

如果您想要在所有元素之间执行此操作,您可以像这样插入这些大小为 1 的维度:

a[np.newaxis,:] * b[:,np.newaxis]

试试吧!这确实是一个方便的概念,尽管一开始我确实看到这有多么令人困惑。

关于python - Numpy 元素明智的除法没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24585661/

相关文章:

python - 从 pd.DataFrame 获取列标签索引的有效方法

python - 如何将 1D numpy 数组从 keras 层输出更改为图像(3D numpy 数组)

python - 如何从列表中随机选择连续样本?

python - 如何在PyTorch中正确使用Numpy的FFT函数?

python - 使用 Python 拆分 ps 的输出

python - 如何在 Robot Framework 中发送带有空数据 JSON 的 post 请求?

python - 如何使用 Paramiko 从 SFTP 服务器下载最新文件而不使用循环?

python - Numpy 中的数组表达式

python : Was expecting one of: <NEWLINE>

python - 如何创建打印变量的快捷方式(vscode)