所以我有一个5个整数v的数组和10个整数v的另一个数组。
我有一个5乘10的矩阵P,我想要填充(P)ij = v[i] + u[j]
我试过了:
P = np.empty((len(asset_grid),len(asset_grid)))
for i in range(asset_grid):
for j in range(asset_grid):
P[i,j] = asset_grid[i] + asset_grid[j]
但它给了我一个错误
TypeError: only integer arrays with one element can be converted to an index
我应该如何在Python中执行此操作。如果我的方法太天真,我很抱歉,我习惯了Matlab,现在慢慢学习Python。任何帮助表示赞赏。
答案 0 :(得分:2)
广播就是你想要做的。虽然对于像你这样的小型数组,它没有什么区别,但它与较大的数组产生了重要的差异:
>>> arr1 = np.arange(5)
>>> arr2 = np.arange(10,20)
>>> arr1[:,None] + arr2
array([[10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
[13, 14, 15, 16, 17, 18, 19, 20, 21, 22],
[14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
通常使用numpy
,您希望避免对行和列进行迭代,并使用向量化/广播操作。这就是速度改进的实际来源。
所以,根据你的评论进行详细阐述:
假设P_ij是x的第i个元素,增加到4次幂减去y的第j个元素,增加到2次幂
一般来说,Python使用通常的Python运算符支持你想要的矢量化大多数算术运算:
>>> arr1[:, None]**4 - arr2**2
array([[-100, -121, -144, -169, -196, -225, -256, -289, -324, -361],
[ -99, -120, -143, -168, -195, -224, -255, -288, -323, -360],
[ -84, -105, -128, -153, -180, -209, -240, -273, -308, -345],
[ -19, -40, -63, -88, -115, -144, -175, -208, -243, -280],
[ 156, 135, 112, 87, 60, 31, 0, -33, -68, -105]])