情况如下:
我有一个图形类型结构,一个邻接列表,这个邻接列表的每个元素都是一维数组(numpy或bcolz ..不确定我是否会使用bcolz)。
每个1维数组以二进制序列的形式表示可能连接的图元素。要使它们连接,它们需要具有特定的按位交叉值。
因此,对于我的邻接列表中的每个1维数组,我想按位"和"在给定数组中两个元素的每个组合之间。
这可能会用于巨大的图广度优先遍历,所以我们可能会谈论非常多的元素。
这是我可以用矢量化操作做的吗?我应该使用不同的结构吗?有什么好办法呢?如果能够显着提升性能,我愿意彻底重组所有内容。
是否像循环播放各个元素一样简单,然后广播(正确的术语?)&对整个阵列?感谢。
快速修改
另外请注意,我使用python整数作为字节序列。从我的理解来看,与numpy一起玩得不好(整数变得太大,输入很长很长)。我必须创建对象类型的数组。这是否会导致巨大的放缓?这是使用不同结构的原因吗?
示例
//创建一个nxn邻接列表,其中n是图节点的数量 //将每个图节点映射到值2 ^ k:
nodevals = defaultdict()
for i in xrange(n):
nodevals[i] = 2**(i+1)
//对于图中的每个边,它由两个节点组成,这两个节点被映射为2的幂。拿出他们的金额,并将它们放在邻接列表中:
for i in xrange(n):
for j in xrange(n):
adjlist[i][j].append((nodevals[i]|nodevals[j]))
//我们现在有了第一个邻接列表,它只是裸露的边缘。这些边可以通过行或列连接,通过将和(nodevals [i] | nodevals [j])与另一边(nodevals [i2] | nodevals [j2])的交点,并检查它是否等于连接每个点。
//这可能对单个边缘似乎没有用,但在将来的迭代中我们可以这样做:
//经过3次迭代。 (5,1)连接到(1,9),然后连接到(7,5),例如:
adjlist[5][1] & adjlist[1][9] == 1
adjlist2[5][9] == adjlist[5][1]|adjlist[1][9]
adjlist[7][5] & adjlist2[5][9] == 5
adjlist3[7][9] == adjlist[7][5]|adjlist2[5][9]
//所以,您可能会看到这对于有效遍历有何用处 //然而,它变得更加复杂,因为随着我们增加子路径的长度,或者#34;伪边缘#34;或者你想要调用它们的任何东西,
//给定(i,j)的数组包含越来越多可能连接的子路径总和 //很快阵列会变得非常大,这时我想要有效地计算交叉点// AND,特别针对这个问题,我希望能够将边缘连接到SAME边缘,所以我想在给定数组中的所有元素对之间进行按位交叉 (即该邻接列表的给定索引[i] [j])。