0
最近我一直在關注以前的問題here的一些方法。Numpy array rounding
我已經創建了一個腳本來使用它,並添加了一些可視化來幫助顯示我遇到的問題。
#Python 2.7, import future division
from __future__ import division
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
#Set length of sides and number of divisions of each side
latva = 6
latvb = 6
latvc = 6
latdiv = 20
#Step of each iteration per side
latvadiv = latva/latdiv
latvbdiv = latvb/latdiv
latvcdiv = latvc/latdiv
#Init array of zeroes
lol = np.zeros((latdiv**3,4),dtype=np.float64)
#Change zero array to number array,
lol[:,:3] = np.arange(latdiv**3)[:,None]//(latdiv**2,latdiv,1)*(latvadiv,latvbdiv,latvcdiv)%(latva,latvb,latvc)
#Mark lattice sides
for item in lol:
if (item[0] < latvadiv/2) and (item[1] < latvbdiv/2):
item[3] = 99
elif (item[0] < latvadiv/2) and (item[2] < latvcdiv/2):
item[3] = 99
elif (item[1] < latvbdiv/2) and (item[2] < latvcdiv/2):
item[3] = 99
#Remove anything that is not a lattice side
lol = lol[~(lol[:,3] < 99)]
#Graph display
x = lol[:,[0]]
y = lol[:,[1]]
z = lol[:,[2]]
v = lol[:,[3]]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, zdir='z', s=20, c=v, depthshade=True)
plt.show()
現在,如果這個運行時,你會得到一個漂亮的小3D圖形,顯示正是它應該是:3行,每行20個點。
現在,變化
latva = 6
latvb = 6
latvc = 6
到
latva = 3.007164
latvb = 3.007164
latvc = 3.007164
,看圖形如何被摧毀,從理論上(在我的理解 - 這很好地可能是錯誤的)圖上的點應該放在一起。在3.007164單位內20分,而不是6單位內的20分。
現在,在「更改零數組數陣」部分,如果您更換的最後一部分,國防部的一部分,與:
(round(latva,5),round(latvb,5),round(latvc,5))
你又得到一個正確的圖表。然後,如果您將其更改爲第四位而不是第五位,則會再次出現亂七八糟的圖形,這導致我相信整個問題源自於模擬廣播操作期間的四捨五入問題。有誰知道究竟是什麼問題,以及如何避免它?
你的主要目標是什麼?繪製3條間距可調的垂直線,或瞭解numpy的廣播系統和索引黑客? – Finwood
@Finwood在這種情況下,瞭解廣播如何破壞數組。該圖完全用於可視化輔助,因爲通過8000線陣列手動查看有點乏味。 – MadisonCooper