2016-06-16 43 views
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)) 

你又得到一個正確的圖表。然後,如果您將其更改爲第四位而不是第五位,則會再次出現亂七八糟的圖形,這導致我相信整個問題源自於模擬廣播操作期間的四捨五入問題。有誰知道究竟是什麼問題,以及如何避免它?

+0

你的主要目標是什麼?繪製3條間距可調的垂直線,或瞭解numpy的廣播系統和索引黑客? – Finwood

+0

@Finwood在這種情況下,瞭解廣播如何破壞數組。該圖完全用於可視化輔助,因爲通過8000線陣列手動查看有點乏味。 – MadisonCooper

回答

0

這似乎是一個與國防部操作問題。

我解決它通過添加:

latva = round(latva,3) 
    latva = list(str(latva)) 
    if (int(latva[-1]) - 1) != -1: 
     latva[-1] = str(int(latva[-1]) - 1) 
    latva = float("".join(latva)) 

    latvb = round(latvb,3) 
    latvb = list(str(latvb)) 
    if (int(latvb[-1]) - 1) != -1: 
     latvb[-1] = str(int(latvb[-1]) - 1) 
    latvb = float("".join(latvb)) 

    latvc = round(latvc,3) 
    latvc = list(str(latvc)) 
    if (int(latvc[-1]) - 1) != -1: 
     latvc[-1] = str(int(latvc[-1]) - 1) 
    latvc = float("".join(latvc)) 

只是非零陣列創建之前。