您可以使用linear indexing
助陣,像這樣 -
# Get cosine and sine values in one-go
cosv = np.cos(x_axis_rotations)
sinv = np.sin(x_axis_rotations)
# Get size parameter
N = x_axis_rotations.size
# Initialize output array
out = np.zeros((N,3,3))
# Set the first element in each 3D slice as 1
out[:,0,0] = 1
# Calculate the first of positions where cosine valued elements are to be put
idx1 = 4 + 9*np.arange(N)[:,None]
# One by one put those 4 values in 2x2 blocks across all 3D slices
out.ravel()[idx1] = cosv
out.ravel()[idx1+1] = -sinv
out.ravel()[idx1+3] = sinv
out.ravel()[idx1+4] = cosv
或者,你可以設置中的元素一去,你有zeros
初始化輸出數組後,並在每個切片組的第一個元素爲1
,像這樣 -
out.reshape(N,-1)[:,[4,5,7,8]] = np.column_stack((cosv,-sinv,sinv,cosv))
上述兩種方法之間,兩個中景方法可能演變,再初始化後W擺正第i個零和設置在每個3D片的第一個元素爲1
,像這樣 -
out.reshape(N,-1)[:,[4,8]] = cosv[:,None]
out.reshape(N,-1)[:,[5,7]] = np.column_stack((-sinv[:,None],sinv[:,None]))
最後一個是 -
out.reshape(N,-1)[:,[4,8]] = cosv[:,None]
out.reshape(N,-1)[:,5] = -sinv
out.reshape(N,-1)[:,7] = sinv
所以,如果我理解正確的話,你要以3D陣列?輸入來自哪裏?一個文件或者你在運行時產生的東西? – ventsyv
您能否解釋一下爲什麼要存儲這些矩陣而不是在使用時計算它們的原因? – Simpom
@Simpom我想實現[本文]中概述的點對三角技術(http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.479.8237&rep=rep1&type=pdf)。這個想法是,通過爲網格的每個三角形預先計算一個變換矩陣,可以減少從點到三角形問題的3D距離,變成更簡單的2D圖形,可以比重心計算更快地計算出來。如果我只想要一個點查詢,那麼是沒有必要計算矩陣。但是,如果我有一百萬點查詢,那麼這應該證明是有用的。 – Fnord