簡體   English   中英

驗證均勻分布的 3D 坐標的分布

[英]verify distribution of uniformly distributed 3D coordinates

我想寫一個python腳本來生成一個均勻分布的3D坐標(例如,x、y、z),其中x、y和z是0到1之間的浮點數。目前,z可以固定,那么什么我需要的是 2D (xy) 平面中的均勻分布點。 我編寫了一個腳本來完成這項工作,並檢查了 x 和 y 都是統一數字。 但是,我不確定這些點是否均勻分布在 (xy) 平面中。

我的代碼是

1 import matplotlib.pyplot as plt
2 import random
3 import numpy as np
4 import csv
5 nk1=300
6 nk2=300
7 nk3=10
8 kx=[]
9 ky=[]
10 kz=[]
11 for i in range(nk1):
12     for j in range(nk2):
13         for k in range(nk3):
14             xkg1=random.random()
15             xkg2=random.random()
16             xkg3 = float(k)/nk3
17             kx.append(xkg1)
18             ky.append(xkg2)
19             kz.append(xkg3)
20 kx=np.array(kx)
21 count, bins, ignored = plt.hist(kx, normed=True)
22 plt.plot(bins, np.ones_like(bins), linewidth=2, color='r')
23 plt.show()

該圖顯示“kx”和“ky”都是均勻分布的數字,但是,如何確保 xy 在 2D 平面中均勻分布?

正如你所用np.histogram 1 1D檢查一致性,你可以使用np.histogram2d做同樣的事情在2D和np.histogramdd在3D +。

舉個例子,讓我們首先通過讓它們消失來修復你的循環:

kx = np.random.random(nk1 * nk2 * nk3)
ky = np.random.random(nk1 * nk2 * nk3)
kz = np.tile(np.arange(nk3) / nk3, n1 * n2)

hist2d, *_ = np.histogram2d(kx, ky, range=[[0, 1], [0, 1]])

range 參數確保您在每個方向上對 [0, 1) 進行分箱,而不是超過實際的最小值和最大值,無論數據有多接近。

現在完全取決於您如何在hist2d可視化 100 個數據點。 一種簡單的方法是將它拆散並制作一個條形圖,就像您為一維案例所做的那樣:

plt.bar(np.arange(hist2d.size), hist2d.ravel())
plt.plot([0, hist2d.size], [nk1 * nk2 * nk3 / hist2d.size] * 2)

另一種簡單的方法是制作熱圖

plt.imshow(hist2d, interpolation='nearest', cmap='hot')

這實際上不如條形圖有用,也不能推廣到更高的維度。

您最好的選擇可能只是檢查原始數據的標准偏差。


1或者更確切地說plt.histplt.hist為您做了。

在@Mad Physicist 的幫助下,我終於找到了驗證2D 中隨機數均勻分布的方法。 在這里,我發布了我的腳本,並解釋了詳細信息:

 1 import numpy as np
 2 import random
 3 import matplotlib.pyplot as plt
 4 import matplotlib
 5 fig = plt.figure()
 6 ax1 = fig.add_subplot(211)
 7 ax2 = fig.add_subplot(212)
 8 nk=100
 9 nk=100
10 nk=1
11 kx1=[]
12 ky1=[]
13 kz1=[]
14 for i in range(nk1):
15     for j in range(nk2):
16         for k in range(nk3):
17             xkg =r andom.random()
18             ykg = random.random()
19             zkg = float(k)/nk3
20             kx.append(xkg)
21             ky.append(ykg)
22             kz.append(zkg)
23 kx=np.array(kx)
24 ky=np.array(ky)
25 kz=np.array(kz)
26 xedges, yedges = np.linspace(0, 1, 6), np.linspace(0, 1, 6)
27 ## count the number of poins in the region definded by (xedges[i], 
    xedges[i+1])
28 ## and (yedges[i], xedges[y+1]). There are in total 10*10 2D 
    squares. 
29 hist, xedges, yedges = np.histogram2d(kx, ky, (xedges, yedges))
30 xidx = np.clip(np.digitize(kx, xedges) - 1, 0, hist.shape[0] - 1)
31 yidx = np.clip(np.digitize(ky, yedges) - 1, 0, hist.shape[1] - 1)
32 ax1.bar(np.arange(hist.size),hist.ravel())
33 ax1.plot([0,hist.size], [nk1 * nk2 * nk3 / hist.size] * 2)
34 c = hist[xidx, yidx]
35 new = ax2.scatter(kx, ky, c=c, cmap='jet') 
36 cax, _ = matplotlib.colorbar.make_axes(ax2)
37 cbar = matplotlib.colorbar.ColorbarBase(cax, cmap='jet')
38 ax2.grid(True)
39 plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM