Python Numpy:有效地应用获取周围单元格的功能

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):

我有一个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):
            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)
请用
自我解决方案的最低示例展示上面的一些工作示例。否则我们不知道你在说什么。