Numpy数组舍入

2024-04-20 03:52:08 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我一直在遵循前面一个问题here的一些方法。你知道吗

我已经创建了一个脚本来使用它,并添加了一些可视化来帮助显示我遇到的问题。你知道吗

#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()

现在,如果运行这个程序,你会得到一个非常小的三维图形,它精确地显示了它应该显示的内容:3条线,每条线有20个点。你知道吗

现在,换衣服

latva = 6
latvb = 6
latvc = 6

latva = 3.007164
latvb = 3.007164
latvc = 3.007164

观察图形是如何被破坏的,理论上(在我的理解中——这很可能是错误的)图形上的点应该间隔得更近。3.007164个单位内得20分,而不是6个单位内得20分。你知道吗

现在在“将零数组更改为数字数组”部分,如果您将最后一部分mod部分替换为:

(round(latva,5),round(latvb,5),round(latvc,5))

你又得到了一个正确的图表。如果你把它改成四舍五入而不是五舍五入,你会再次得到一个混乱的图表,这让我相信整个问题源于mod广播操作期间的四舍五入问题。有人知道问题到底是什么,以及如何避免吗?你知道吗


Tags: andofimportnppltitemsidelol
1条回答
网友
1楼 · 发布于 2024-04-20 03:52:08

这似乎是一个与国防部的运作问题。你知道吗

我通过加上:

    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))

就在非零数组创建之前。你知道吗

相关问题 更多 >