下面的代碼是一個矢量解決問題的方法:
import numpy as np
r = np.asarray([2,2.8,3.2,3.5,3.7,3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.7,3.5,3.2,2.8,2])
l = 1
R = r.size
n, m = np.mgrid[1:R+1, 1:R+1]
h1 = np.sqrt(r[:, np.newaxis]**2 + (l*(n-m) + l/2.)**2)
h2 = np.sqrt(r[:, np.newaxis]**2 + (l*(n-m) - l/2.)**2)
k2 = h1 - h2
結果k2
是一個2維陣列而不是一個矢量:
>>> np.set_printoptions(precision=1)
>>> k2
array([[ 0. , -0.4, -0.7, -0.8, -0.9, -0.9, -0.9, -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. ],
[ 0.3, 0. , -0.3, -0.6, -0.7, -0.8, -0.9, -0.9, -0.9, -0.9, -1. , -1. , -1. , -1. , -1. , -1. , -1. ],
[ 0.5, 0.3, 0. , -0.3, -0.5, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9, -1. , -1. , -1. , -1. , -1. ],
[ 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9, -0.9, -1. , -1. , -1. ],
[ 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.9, -0.9, -0.9, -0.9, -0.9, -0.9, -1. ],
[ 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9, -0.9],
[ 0.8, 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9, -0.9],
[ 0.9, 0.8, 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9, -0.9],
[ 0.9, 0.9, 0.8, 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9, -0.9],
[ 0.9, 0.9, 0.9, 0.8, 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8, -0.9],
[ 0.9, 0.9, 0.9, 0.9, 0.8, 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8, -0.8],
[ 0.9, 0.9, 0.9, 0.9, 0.9, 0.8, 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7, -0.8],
[ 1. , 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.8, 0.7, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6, -0.7],
[ 1. , 1. , 1. , 0.9, 0.9, 0.9, 0.9, 0.9, 0.8, 0.8, 0.6, 0.5, 0.3, 0. , -0.3, -0.5, -0.6],
[ 1. , 1. , 1. , 1. , 1. , 0.9, 0.9, 0.9, 0.9, 0.8, 0.8, 0.7, 0.5, 0.3, 0. , -0.3, -0.5],
[ 1. , 1. , 1. , 1. , 1. , 1. , 1. , 0.9, 0.9, 0.9, 0.9, 0.8, 0.7, 0.6, 0.3, 0. , -0.3],
[ 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 1. , 0.9, 0.9, 0.9, 0.8, 0.7, 0.4, 0. ]])
希望這是結果你正在尋找。
請注意,爲了節省空間,只顯示一位十進制數字。
您可能會發現在Numpy的文檔中查看功能mgrid和對象newaxis的描述以幫助您弄清楚此代碼的工作原理。
謝謝鎘我感謝您的幫助,我想我可以從這裏開始 –
@NamKang:使用魔術常數(如17)被認爲是**糟糕的編程習慣**。如果您通過添加或刪除某些元素來更改'r'的大小,除非您手動將值'17'替換爲'r'的新大小,否則上述代碼將無法正常工作(同樣適用於值'16 '出現在while循環中)。這就是爲什麼我在我的解決方案中引入變量'R'的原因。 – Tonechas
如果我已經知道這些值中的某些值會變爲零,那麼是否有辦法避免執行這些計算? –