适当的numpy矢量化

适当的numpy矢量化,numpy,Numpy,我正在尝试矢量化我的代码。我正在转化吗 def acceleration_1(grid): nx = grid.shape[0] ny = grid.shape[1] acc = np.zeros((nx,ny,2)) for i in range(1,nx-1): for j in range(1,ny-1): acc[i,j,0] = grid[i+1,j,0] + grid[i-1,j,0] - 2*grid[i,j,0] acc[i,j,

我正在尝试矢量化我的代码。我正在转化吗

def acceleration_1(grid):

  nx = grid.shape[0]
  ny = grid.shape[1]
  acc = np.zeros((nx,ny,2))
  for i in range(1,nx-1):
    for j in range(1,ny-1):
      acc[i,j,0] = grid[i+1,j,0] + grid[i-1,j,0] - 2*grid[i,j,0]
      acc[i,j,1] = grid[i,j+1,1] + grid[i,j-1,1] - 2*grid[i,j,1]
对此

def acceleration_2(grid):

  nx = np.arange(1,grid.shape[0]-1)
  ny = np.arange(1,grid.shape[1]-1)
  acc = np.zeros((grid.shape[0],grid.shape[0],2))

  acc[nx,ny,0] = grid[nx+1,ny,0] + grid[nx-1,ny,0] - 2*grid[nx,ny,0]
  acc[nx,ny,1] = grid[nx,ny+1,1] + grid[nx,ny-1,1] - 2*grid[nx,ny,1]
适当地


我知道我也可以用矩阵乘法来表示。但将其转换为矩阵运算似乎很麻烦。通过将for循环转换为“nx”和“ny”上的隐式迭代,我是否可以获得最佳加速

好像你在做卷积运算。你可以用numpy来做这件事,就像你展示的那样。或者,我们可以使用内置卷积功能:

from scipy.signal import convolve2d

k_y = np.array([[1, -2, 1]]).T
k_x = np.array([[1, -2, 1]])

acc = np.zeros_like(grid)
acc[:, :, 0] = convolve2d(grid[:, :, 0], k_y, mode='same')
acc[:, :, 1] = convolve2d(grid[:, :, 1], k_x, mode='same')

要完全用numpy来实现这一点:

pad_y = np.pad(grid[:, :, 0], ((1, 1), (0, 0)), mode='constant')
pad_x = np.pad(grid[:, :, 1], ((0, 0), (1, 1)), mode='constant')

up    = pad_y[:-2,  1:-1]
down  = pad_y[2:,   1:-1]
left  = pad_x[1:-1, :-2]
right = pad_x[1:-1, 2:]

acc = np.zeros_like(grid)
acc[:, :, 0] = up   + down  - 2 * grid[:, :, 0]
acc[:, :, 1] = left + right - 2 * grid[:, :, 1]

第一个例子不起作用。为什么不
[i,j,0]
[i,j,1]
?你的数组形状也是二维的。而且,
grid[i,j+1,1]
不应该是
grid[i,j+1,2]
?哎呀,谢谢你。格式化。似乎无法在两个单独的数组上迭代。所以acc_2不工作。您所说的
acc_2
是什么意思?对不起,功能加速度_2不能正常工作。不能将不同形状的数组作为参数进行迭代。啊。你可以通过填充(给边界加零)使它们成为正确的形状。不,我是说在我的函数中。你的很好。您不能创建两个数组,nx和ny,并假设numpy将迭代(nx,ny)的所有对。