###与えられた多数の粒子の位置情報から粒子密度を求めたい。
粒子の位置情報を乱数で与え、そこからグリッドで分割された(一次元)空間における粒子の密度を推定するプログラムを作成しています。
一つの考えとしてfor文を使えば密度を推定することができるのですが、計算速度があまり速くありません。for文を使わずに密度を推定する方法があるでしょうか?
###for文を用いた方法
python
1import numpy as np 2import matplotlib.pyplot as plt 3nop=100 #粒子数 4nx =10 #空間グリッド数 5dx =1 #グリッド幅 6lx =nx*dx #空間長 7xx =np.arange(nx) #空間をグリッドに分割 8xp =np.random.rand(nop)*lx #粒子位置を乱数で生成 9ds =np.zeros(nx) #密度、0クリア 10 11for ip in range(nop): 12 ix=int(xp[ip]/dx) #粒子をグリッド状に分配 13 ds[ix]=ds[ix]+1 #グリッド上の粒子を数える 14 15plt.subplot(2,1,1); plt.plot(xp,np.ones(nop),'.') 16plt.subplot(2,1,2); plt.plot(xx,ds,'-o') 17plt.show()
この方法を使って粒子数を10**6個にしたところ計算時間が3.05秒でした。
###for文を使わない方法(失敗)
計算時間がかかっているfor文を使わずに上記のプログラムと同じことをしたいと思っています。そこで以下のようなプログラムを作製したのですが、うまく行きませんでした。なにかいい方法があるのでしょうか?それともこの場合はfor文を使わざるおえないのでしょうか?
python
1import numpy as np 2import matplotlib.pyplot as plt 3nop=100 #粒子数 4nx =10 #空間グリッド数 5dx =1 #グリッド幅 6lx =nx*dx #空間長 7xx =np.arange(nx) #空間をグリッドに分割 8xp =np.random.rand(nop)*lx #粒子位置を乱数で生成 9ds =np.zeros(nx) #密度、0クリア 10#for ip in range(nop): 11ix=np.int_(xp/dx) #粒子をグリッド状に分配 12ds[ix]=ds[ix]+1 #グリッド上の粒子を数える 13 14plt.subplot(2,1,1); plt.plot(xp,np.ones(nop),'.') 15plt.subplot(2,1,2); plt.plot(xx,ds,'-o') 16plt.show()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/28 04:01
2017/07/28 04:39
2017/07/28 07:51