Python Numpy:有效地应用获取周围单元格的功能
我有一个numpy阵列(势),我想计算电磁场。现在它是我的程序的瓶颈 我有一个数组V维n+2,m+2。我想创建一个数组E维n,m。每个单元的计算是做单元是~: sqrt((单元格左-单元格右)^2+(单元格上-单元格下)^2) 我想知道是否有一种方法可以将函数应用于整个数组,以避免“for循环”的昂贵计算: 现在我的代码是:Python Numpy:有效地应用获取周围单元格的功能,python,numpy,Python,Numpy,我有一个numpy阵列(势),我想计算电磁场。现在它是我的程序的瓶颈 我有一个数组V维n+2,m+2。我想创建一个数组E维n,m。每个单元的计算是做单元是~: sqrt((单元格左-单元格右)^2+(单元格上-单元格下)^2) 我想知道是否有一种方法可以将函数应用于整个数组,以避免“for循环”的昂贵计算: 现在我的代码是: def set_e(self): pass for i in range(0, n): for j in range(0, m):
def set_e(self):
pass
for i in range(0, n):
for j in range(0, m):
self.E[i, j] = self.get_local_e(i, j)
def get_local_e(self, i, j):
return (
((self.solution[i + 2, j + 1] - self.solution[i, j + 1]) / unt_y) ** 2
+ ((self.solution[i + 1, j + 2] - self.solution[i + 1, j]) / unt_x) ** 2
) ** 0.5
感谢对本期感兴趣的人士,可以通过以下方式进行阵列计算:
def set_e(self):
y_tmp = np.power((self.solution[:-2, 1:-1] - self.solution[2:, 1:-1]) / unt_y, 2)
x_tmp = np.power((self.solution[1:-1, :-2] - self.solution[1:-1, 2:]) / unt_x, 2)
self.E = np.power(x_tmp + y_tmp, 0.5)
它解决了我的问题让我们在这里继续努力。
你的方程有些奇怪,因为它只计算沿一行的梯度,请参见y\u tmp
。
梯度函数沿所有行和列计算,这就是输入的形状与输出的形状相同
import numpy as np
solution = np.array([[1.0, 2.0, 3.0, 4.0],
[3.0, 5.0, 7.0, 9.0],
[5.0, 8.0, 11.0, 14.0],
[7.0, 11.0, 15.0, 19.0]])
unt_y = 1
unt_x = 1
g = np.gradient(solution, unt_y, unt_x)
print(g)
a,b = g
c = np.power(a+b, 2.0)
print(c)
def set_e():
y_tmp = np.power((solution[:-2, 1:-1] - solution[2:, 1:-1]) / unt_y, 2)
print('y_tmp', y_tmp)
x_tmp = np.power((solution[1:-1, :-2] - solution[1:-1, 2:]) / unt_x, 2)
E = np.power(x_tmp + y_tmp, 0.5)
print(E)
set_e()
你如何处理边缘的单元格在我的例子中,单元格边缘是边界条件这基本上就像是
np.gradient(self.solution,(unt_y,unt_x))**2
我想使用这个函数,但我似乎无法使用你的代码行,它说“TypeError:“varargs”不是有效的关键字参数。”我在网上找不到他们同时使用的例子,距离x和y请显示你正在使用的线。梯度(self.solution,(unt_y,unt_x))应该可以工作,也np.gradient(self.solution,unt_y,unt_x)
我试着用一个简单的例子调试:将numpy导入为np打印(np.gradient(np.eye(5),1,2))
np.gradient(self.solution,unt_y,unt_x)似乎是可行的,但它会给我一个形状为(2,5,5)的数组。我能做的最简单的是a,b=np.gradient(np.eye(5),1,2)c=np.power(a+b,2)
请用自我解决方案的最低示例展示上面的一些工作示例。否则我们不知道你在说什么。