そのため、ソフトウェアでかなり大きなボトルネックに遭遇しました。cords
各行が座標に対応する座標のセットがありX,Y,Z
ます。の各座標にcords
は、 で定義された領域がありatom_proj
ます。変数はatoms
変数に対応し、cords
にキーを提供しますatom_proj
。
座標をgrid
配列に投影してから回転させ、回転数が満たされるまで繰り返します。Y を無視して、X 座標と Z 座標のみを投影します。
以下のコードの簡略化されたバージョンがあります。小さな座標セットと回転数の場合、コードは比較的高速に実行されます。ただし、座標セットと回転リストの両方が大きい場合は、時間がかかることがあります。座標の数は、数百から数万までさまざまです。grid
ヒート マップを作成するために、その領域を一定数または回転させて投影します。座標セットのヒート マップの例も以下に示します。
質問:
(i) - 座標の行列への投影時間を短縮するにはどうすればよいですか
grid
(ii) -配列スプライシングではなく座標領域を適用するより Pythonic な方法はありますか?
import numpy as np
cords = np.array([[5,4,5],[5,4,3],[6,4,6]])
atoms = np.array([['C'],['H'],['C']])
atom_proj = {'H':np.array([[0,0,0,0,0],[0,0,1,0,0],[0,1,1,1,0],[0,0,1,0,0],[0,0,0,0,0]]),'C':np.array([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[0,0,1,1,1,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]])}
grid = np.zeros((10,10))
for rot in xrange(1,10):
# This for loop would contain a list of list of rotations to apply which are calculated before hand.
# apply rotation
for values in zip(cords, atoms):
atom_shape = np.shape(atom_proj[values[1][0]])
rad = (atom_shape[0]-1)/2
grid[values[0][2]-rad:values[0][2]+rad+1,values[0][0]-rad:values[0][0]+rad+1] += atom_proj[values[1][0]]
print grid
ヒートマップ: