我有這個 for 回圈來計算 3D numpy 陣列的元素:
A = np.zeros((N - 2, N - 2, N - 2))
for i in range(1, N - 1):
for j in range(1, N - 1):
for k in range(1, N - 1):
A[i - 1, j - 1, k - 1] = (B[i,j,k] * dy[j] * dz[k] B[i,j-1,k] * dy[j-1] * dz[k]
B[i,j,k-1] * dy[j] * dz[k-1] B[i,j-1,k-1] * dy[j-1] * dz[k-1]) / (4 * dx[i])
其中 B 是形狀 (N, N, N) numpy 陣列,dx、dy 和 dz 是長度為 N-1 的 numpy 陣列。對于大 N 這真的很慢所以我嘗試了這樣的事情:
A = (B[1:-1, 1:-1, 1:-1] * dy[1:] * dz[1:] B[1:-1, :-2, 1:-1] * dy[:-1] * dz[1:]
B[1:-1, 1:-1, :-2] * dy[1:] * dz[:-1] B[1:-1, :-2, :-2] * dy[:-1] * dz[:-1]) / (4 * dx[1:])
除非 dx、dy 和 dz 是常數,否則這不起作用。我也試過:
dX, dY, dZ = np.meshgrid(dx, dy, dz)
A = (B[1:-1, 1:-1, 1:-1] * dY[1:, 1:, 1:] * dZ[1:, 1:, 1:] B[1:-1, :-2, 1:-1] * dY[:-1, :-1, :-1] * dZ[1:, 1:, 1:]
B[1:-1, 1:-1, :-2] * dY[1:, 1:, 1:] * dZ[:-1, :-1, :-1] B[1:-1, :-2, :-2] * dY[:-1, :-1, :-1] * dZ[:-1, :-1, :-1]) / (4 * dX[:-1, :-1, :-1])
但這也行不通。
關于如何做到這一點的任何想法?
uj5u.com熱心網友回復:
A[i - 1, j - 1, k - 1] = (B[i,j,k] * dy[j] * dz[k] B[i,j-1,k] * dy[j-1] * dz[k]
B[i,j,k-1] * dy[j] * dz[k-1] B[i,j-1,k-1] * dy[j-1] * dz[k-1]) / (4 * dx[i])
讓我們將迭代更改為 (0,N-2)
A[i, j, k] = (B[i 1,j 1,k 1] * dy[j 1] * dz[k 1] B[i 1,j,k 1] * dy[j] * dz[k 1]
B[i 1,j 1,k] * dy[j 1] * dz[k] B[i 1,j,k] * dy[j] * dz[k]) / (4 * dx[i 1])
并分別處理 4 個術語
B[1:,1:,1:]*dy[None,1:,None]*dz[None,None,1:]
B[1:,:-1,1:]*dy[None,:-1,None]*dz[None,None,1:]
etc
我在沒有測驗的情況下寫了這些,所以可能會有錯誤,但希望這足以讓你開始。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367993.html
