欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

询问如何有效地表示和比较数据类型(六边形)?

最编程 2024-04-06 12:59:38
...

前提

我正在使用numpy在python中进行一个私人项目。我的程序使用六边形,它的边缘有某些特性。我目前用numpy数组来表示这些六边形,每个边都有一个条目。有必要比较六边形的平等,这是特殊的,因为一些可微性特征被认为是平等的。另外,如果在另一次旋转中是相同的,则六边形应该是相等的(numpy数组是桶状滚动的)。为了解决第一个问题,边用字节表示,每一个位都表示一个“相等”的特征。现在,两条边可以简单地通过bitwise_and进行比较,而任何值非零都是相等的。为了解决第二个问题,通过比较六进制与其他六进制的所有六次旋转来检查等式。这里我描述的所有数组都是dtype=uint8的,所以255bitwise_and的中性元素。

问题

六边形的每一种排列都有一个与之相关联的值。我的意思是六边形的特征是如何排列的,例如两个相邻的边有一个特征,另外四个是另一个特征。对于这个值来说,具体的特性并不重要。因此十六进制[4, 4, 2, 8, 8, 8]的值与十六进制[2, 4, 4, 1, 2, 2] (注意旋转为1并替换值)具有相同的值。

此外,边可以有“不关心”作为一个功能(由所有二进制表示,以使等式检查工作的预期)。在这种情况下,我需要找到所有兼容的六边形的相关值,而不管这个特殊边缘的特征。

我需要的是这些“元”-hexagons的巧妙表示,它只关心排列而不是特性类型。然后,我需要一种方法,为一个给定的六边形,以找到所有的元六边形,可以描述它的安排。

Ideas

一种方法是像其他六边形一样表示元六边形,使用数字来区分每一个独特的特征。像[1, 1, 2, 1, 2, 2]这样的元十六进制需要匹配任何十六进制[x, x, y, x, y, y]

如何找到一个给定的六边形与“不关心”-edges的所有元-六边形?

A:,一种可能性是为给定的六边形创建所有可能的元六边形.这种方法的问题是,可能性的数量可能相当大。例如,我的应用程序中有一个常见的六边形,它有五个相邻的“不关心”-edges(只有一个重要的特性)。特性的数量只有大约5个(实际上更多,但有些特性是相互排斥的,因此5个独立的特性是一个很好的近似),但是即使这样,5^5=3125 (由于旋转下的相等而减去一对)看起来也相当多。这种方法的优点是我不需要对元十六进制进行任何相等检查,并且可以使用字典来访问值(例如,使用numpy字节作为键)。

B:另一种可能是将元十六进制保存在一个numpy数组中,这样就可以同时与所有元十六进制进行快速比较。在这种情况下,您可以离开“不关心”-edges,因为它们是(所有的位),并且只需要将给定的特性转换成元十六进制表示。因此,[2, 8, 8, 255, 255, 255]将成为类似于[1, 2, 2, 255, 255, 255]的东西,可以使用bitwise_and进行比较,并再次进行非零检查,以使“不关心”边缘与任何东西匹配。在这种情况下,问题是六边形将不匹配像[2, 3, 3, 1, 1, 1]这样的元六边形,在这种情况下,特性的编号是不同的,尽管它应该这样。因此,所有可能的编号方案和轮调将必须创建。即使有这样的规则,数字从一个特性增加到另一个功能,它将是几十种可能的表示。

问题

一般来说,是否有一种方法来表示多边形,以便两个不同旋转但在其他情况下相等的多边形可以被识别为多边形,而不必比较所有可能的旋转?

  1. ,我应该研究numpy函数,以便在A中实现我的想法。用所有可能的特性替换所有的“不关心”听起来像排列?

  1. For B中的方法,有办法进一步减少我必须创建的六边形数量吗?

任何帮助都是值得感激的,我已经想了三天了,在我的脑海里来回回荡。因此,即使是远程相关的链接和阅读材料,或者仅仅是查找和/或添加到这个问题的标签的关键字,都会很高兴地收到。我也是新来的,所以任何关于堆栈溢出的提示都是受欢迎的!

如果你读了这么多,谢谢你抽出时间!