Python 从整数创建球体最近邻列表
我试图在python中构造一个最近邻列表,它将节点的最近邻存储在有限的3d六边形最近邻填充(HCP)晶格中。我已经用二维正方形晶格定义了这样的结构。我不需要坐标,但这只是一种快速的方法,可以从整数列表中为HCP创建最近邻列表。下面是我如何使用方形晶格完成此任务的示例代码Python 从整数创建球体最近邻列表,python,geometry,Python,Geometry,我试图在python中构造一个最近邻列表,它将节点的最近邻存储在有限的3d六边形最近邻填充(HCP)晶格中。我已经用二维正方形晶格定义了这样的结构。我不需要坐标,但这只是一种快速的方法,可以从整数列表中为HCP创建最近邻列表。下面是我如何使用方形晶格完成此任务的示例代码 N = int #number of nodes L = side # a 32x32 graph, L would be 32 for i in range(N): nearNeighbor[i][0] = (i
N = int #number of nodes
L = side # a 32x32 graph, L would be 32
for i in range(N):
nearNeighbor[i][0] = (i + 1 ) % N
nearNeighbor[i][1] = (i + (N - 1)) % N
nearNeighbor[i][2] = (i + L) % N
nearNeighbor[i][3] = (i + N - L) % N
if (i-L < 0):
nearNeighbor[i][3] = -2
if (i+L >= N):
nearNeighbor[i][2] = -2
if (i%L) == 0:
nearNeighbor[i][1] = -2
if ((i+1)%L) == 0:
nearN[eighbori][0] = -2
N=int#节点数
L=边#一个32x32的图形,L将是32
对于范围(N)中的i:
近邻[i][0]=(i+1)%N
近邻[i][1]=(i+(N-1))%N
近邻[i][2]=(i+L)%N
近邻[i][3]=(i+N-L)%N
如果(i-L<0):
近邻[i][3]=-2
如果(i+L>=N):
近邻[i][2]=-2
如果(i%L)==0:
近邻[i][1]=-2
如果((i+1)%L)==0:
nearN[eighbori][0]=-2
就这样。现在,一个HCP晶格,当被可视化时,就像一个紧密堆积在一起的巨大球体立方体。每个节点最多应该有12个最近的邻居,它们应该出来组成一个立方体。我想我主要想知道如何使用整数和模运算来表示HCP晶格,就像我对正方形晶格所做的那样。你能帮我堆叠一下吗?这个问题的答案取决于人们如何选择截断HCP晶格并为其编制索引。一个选择是 选择此选项后,以下代码将返回给定站点的邻居列表
def neighbors(i, W, H, D):
A = W * H
plane = i / A
plane_index = i % A
row = plane_index / W
col = plane_index % W
r = -1 if row % 2 else 1 # (-1)**row
p = -1 if plane % 2 else 1 # (-1)**plane
nbors = []
# first include neighbors in same plane
if col != W-1: nbors.append(i+1)
if col != 0: nbors.append(i-1)
if row != H-1: nbors.append(i+W)
if row != 0: nbors.append(i-W)
if (col != 0 or r > 0) and (col != W-1 or r < 0):
if row != H-1: nbors.append(i+W+r)
if row != 0: nbors.append(i-W+r)
# now add neighbors from other planes
if plane != D-1: nbors.append(i+A)
if plane != 0: nbors.append(i-A)
if (col != 0 or p < 0) and (col != W-1 or p > 0):
if plane != D-1: nbors.append(i+A-p)
if plane != 0: nbors.append(i-A-p)
if ((col != W - 1 or p > 0 or r < 0) and
(col != 0 or p < 0 or r > 0) and
(row != H-1 or p < 0) and
(row != 0 or p > 0)):
if plane != D-1:
nbors.append(i + A + p*W + (r-p)/2) #10
if plane != 0:
nbors.append(i - A + p*W + (r-p)/2) #11
return nbors
请注意,测试并没有涵盖所有独特类型的网站,因此,可能仍然有一个角落的情况是错误的。我最初写了一个更长的答案,激发并构建了这段代码。但是,SO给了我一个关于我的帖子如何“似乎包含未正确格式化为代码的代码”(尽管它似乎正确地呈现了所有内容)。如果有人想要更长的描述,让我知道,我会把它放在其他地方。这真的很有帮助,谢谢!我还对你的详细描述感兴趣,也许还有如何在其他配置中找到最近的邻居(比如巨大球体中的球体填充)。我真的很感激。更多细节请参阅。
def test_neighbors():
n = lambda i: set(neighbors(i, 5, 5, 5))
# test bottom layer
assert n(0) == set([1,5,6,25,30])
assert n(2) == set([1,3,7,8,26,27,32])
assert n(4) == set([3,9,28,29,34])
assert n(5) == set([0,6,10,30])
assert n(9) == set([3,4,8,13,14,33,34,38])
assert n(20) == set([15,16,21,45])
assert n(21) == set([16,17,20,22,45,46])
assert n(24) == set([19,23,48,49])
# test second layer
assert n(25) == set([0,1,26,30,31,50,51])
assert n(34) == set([4,9,28,29,33,38,39,54,59])
assert n(36) == set([7,11,12,31,32,35,37,41,42,57,61,62])
assert n(49) == set([24,44,48,74])