python中实数_匹配Python字典中的实数键

我有一个字典,提供从实数元组到标识整数的映射.给定一个包含数字的元组列表,这些数字在容差范围内,但不完全等于字典中的容差,我想生成一个相应整数的列表.

例:

tdict = {(0.334, 0.333, 0.333):1, (0.167, 0.666, 0.167):2, (0.5, 0.5, 0):3}

tlist = [(0.333, 0.333, 0.333), (0.16667, 0.6666667, 0.17), (0.34, 0.33, 0.33), (0.5001, 0.4999, 0.0)]

tol = 0.01

运行我想要的代码应该产生结果

ilist = [1,2,1,3]

因为每个元组中的所有数字都在tdict中相应元组中的数字的给定容差范围内.我可以通过迭代tdict.keys()并单独比较每个,但我觉得应该有更好的方法.获取相应整数到这些元组的最有效方法是什么?它不需要涉及字典,这对我来说似乎是最自然的.我正在使用Python 3.

解决方法:

您显然希望在具有特定网格间距(与您的公差值直接相关)的3D网格上的3D空间中投影点,并创建某种直方图.给自己写一个投影函数:它将一个任意的3元素列表/元组(一个描述空间中的点的向量)作为参数,并将其投影到某个网格点上.你这样做是为了填写你的字典以及阅读它.此外,关于字典中的键,我认为你应该使用整数元组而不是浮点数,因为我不确定浮点数是否可以相同.

这是一个实现示例:

from collections import defaultdict

from random import random as rn

class Grid(object):

def __init__(self, spacing):

self.spacing = spacing

self.griddict = defaultdict(int)

def add_point(self, coords):

"""

`vid`, a voxel id, is a tuple of indices, indicating one grid

bin for each dimension, e.g. (1, 5, 2)

rule: i_x = int(floor(x_coord / spacing))

"""

vid = tuple([int(c//self.spacing) for c in coords])

self.griddict[vid] += 1

def get_point(self, coords):

vid = tuple([int(c//self.spacing) for c in coords])

return self.griddict[vid]

def vid_centercoords(self, vid):

"""

Return the real coordinates in space for a certain voxel,

which is identified by its voxel id `vid` (a tuple of indices).

"""

return tuple([(i-1)*self.spacing + self.spacing/2 for i in vid])

N = 20

fillpoints = [(rn(),rn(),rn()) for _ in xrange(N)]

testpoints = [(rn(),rn(),rn()) for _ in xrange(N)]

grid = Grid(spacing=0.3)

for p in fillpoints:

grid.add_point(p)

print [grid.get_point(p) for p in testpoints]

它的作用:它在3D空间中创建20个随机向量(所有坐标在0和1之间).它使用空间中的这些点填充3D网格.网格在每个维度上的间距为0.3.空间中的这20个点中的每一个被分配给网格中的某个体素(仅用于3D像素的单词).每个赋值将相应体素的计数器增加1(将网格渲染为直方图).然后,使用另一组随机的20个向量来读出体素.这些点再次投射到体素上,但这次计数器只是返回而不是增加.执行测试:

$python gridtest.py

[2, 1, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0]

执行您的数据:

fillpoints = [(0.334, 0.333, 0.333), (0.167, 0.666, 0.167), (0.167, 0.666, 0.167), (0.5, 0.5, 0), (0.5, 0.5, 0), (0.5, 0.5, 0)]

testpoints = [(0.333, 0.333, 0.333), (0.16667, 0.6666667, 0.17), (0.34, 0.33, 0.33), (0.5001, 0.4999, 0.0)]

grid = Grid(spacing=0.03)

for p in fillpoints:

grid.add_point(p)

print [grid.get_point(p) for p in testpoints]

它根据需要打印[1,2,1,3].我没有深入考虑关系间距= 3 *容差.这可能是错的.我只知道存在确定性关系.证明/找到这个公式是留给你作为一个练习:)

标签:python,floating-point,python-3-x

来源: https://codeday.me/bug/20190716/1480339.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值