for i in range(limit_1):
for j in range(limit_2):
a[i][j]=np.sqrt(np.absolute(b[i])**2+np.absolute(c[j])**2)
是否有其他方法可以使用numpy函数执行此任务?
答案 0 :(得分:1)
您的原始代码:
limit_1 = 4
limit_2 = 3
import numpy as np
a = np.zeros([limit_1, limit_2])
b = np.array([1, -6, 7, 3])
c = np.array([3, 2, -1])
print("Original:")
for i in range(limit_1):
for j in range(limit_2):
a[i][j]=np.sqrt(np.absolute(b[i])**2+np.absolute(c[j])**2)
print(a)
输出:
Original:
[[ 3.16227766 2.23606798 1.41421356]
[ 6.70820393 6.32455532 6.08276253]
[ 7.61577311 7.28010989 7.07106781]
[ 4.24264069 3.60555128 3.16227766]]
缩短版本:
print("Improved:")
a = np.sqrt(
np.tile(np.array([b]).transpose(), (1, limit_2)) ** 2 +\
np.tile(np.array(c).transpose(), (limit_1, 1)) ** 2)
print(a)
输出:
Improved:
[[ 3.16227766 2.23606798 1.41421356]
[ 6.70820393 6.32455532 6.08276253]
[ 7.61577311 7.28010989 7.07106781]
[ 4.24264069 3.60555128 3.16227766]]
首先,我们将矢量列b
拉伸到矩阵(然后取其第二次幂):
>>> np.tile(np.array([b]).transpose(), (1, limit_2))
array([[ 1, 1, 1],
[-6, -6, -6],
[ 7, 7, 7],
[ 3, 3, 3]])
>>> np.tile(np.array([b]).transpose(), (1, limit_2)) ** 2
array([[ 1, 1, 1],
[36, 36, 36],
[49, 49, 49],
[ 9, 9, 9]])
然后我们对行列c
执行相同操作:
>>> np.tile(np.array(c).transpose(), (limit_1, 1))
array([[ 3, 2, -1],
[ 3, 2, -1],
[ 3, 2, -1],
[ 3, 2, -1]])
>>> np.tile(np.array(c).transpose(), (limit_1, 1)) ** 2
array([[9, 4, 1],
[9, 4, 1],
[9, 4, 1],
[9, 4, 1]])
然后我们将它们相加并计算根。
P.S。 1 - 我只使用平方功率而不是绝对值,但如果你仍然需要绝对值,你也可以用同样的方法。
P.S。 2 - 请注意,计算可以更高效,即在我们平铺数组之前计算功率,但这种方式对于这个帖子更清晰了)
答案 1 :(得分:0)
请注意,由于n**2
和abs(n)**2
完全相同,因此绝对值没有平方。
使用列表理解:
temp = [math.sqrt(numpy.absolute(x)**2 + numpy.absolute(y)**2) for x in b for y in c]
a = [temp[x:x+limit_2] for x in range(0, len(temp), limit_2)]
答案 2 :(得分:0)
您可以b
将1D
从2D
扩展到c
,然后通过引入新的单例轴作为第二个轴broadcasting
,然后执行操作反对np.sqrt(np.abs(b[:,None])**2 + np.abs(c)**2)
。这将简化那里的事情,并实现了矢量化方法,如此 -
non-negative
另外在其他答案中也谈过,由于平方会固有地产生absolute
个数字,所以我们可以跳过np.sqrt(b[:,None]**2 + c**2)
操作,给我们 -
char ** magazine;
char ** ransom;
*magazine = malloc(sizeof(char*) * m);
for(int magazine_i = 0; magazine_i < m; magazine_i++){
magazine[magazine_i] = (char *)malloc(10240 * sizeof(char));
scanf("%s",magazine[magazine_i]);
}
*ransom = malloc(sizeof(char*) * n);
for(int ransom_i = 0; ransom_i < n; ransom_i++){
ransom[ransom_i] = (char *)malloc(10240 * sizeof(char));
scanf("%s",ransom[ransom_i]);
}