数组

时间:2018-03-02 16:30:59

标签: python arrays numpy bit-manipulation vectorization

情况如下:

我有一个图形类型结构,一个邻接列表,这个邻接列表的每个元素都是一维数组(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])。

0 个答案:

没有答案