numpy数组中的“链接列表”?如何避免重复的条目

时间:2014-02-03 19:59:19

标签: python list numpy

我现在在python中有一个列表列表,其中包含2D numpy数组的每个元素之间的一些计算结果。 (我发现了2D数组中每个值之间的差异)。 为了提高效率并且只执行一次计算(因为X和Y之间的绝对差异对于X和Y都是相同的,这应该只计算一次),

我经历了一个很重要的结果列表。

为了给你一个想法,说我正在使用我的数组中的一个变量:

  

[
     [a],{其他东西在这里(更多变量),但它们可以在示例中被忽略}
     [b],~~
     [c],~~
     [d],~~
     [e],~~
  ]

^(其中a,b,c ......是实际数字)

我需要找到这个变量的每个值之间的绝对差异,所以我做了,并将结果放在一起计算在列表中,如下所示:

  

[
     [(a-b),(a-c),(a-d),(a-e)],
     [(b-c),(b-d),(b-e)],
     [(c-d),(c-e)],
     [(d-e)中],
     ]

我想要的是:

  

[
     [(a-b),(a-c),(a-d),(a-e)],
     [(b-a),(b-c),(b-d),(b-e)],
     [(c-a),(c-b),(c-d),(c-e)],
     [(d-a),(d-b),(d-c),(d-e)],
     ]

但请注意,因为我正在处理绝对差异(例如absolute_value(a-b)), 我不应该再次浏览列表并重新计算差异, 因为abs(a-b)与abs(b-a)相同。

理想情况下,我也不应该将数字abs(a-b)存储两次! 在常规python列表中,我可以将列表的值设置为指向另一个列表的值, 喜欢:

  

>。>>柠檬= [1,2,3,4,5]
  >>> oranges = [999]
  >>>橘子[0] =柠檬
  >>>橘子
  [[1,2,3,4,5]]

这样,值[1,2,3,4,5]只存储在柠檬中; oranges只是引用这些值。即,两个列表之间存在链接。 在numpy数组中这样的事情可能吗? 它看起来像是:

  

[
     [(a-b),(a-c),(a-d),(a-e)],
     [(链接到[0,0]),(b-c),(b-d),(b-e)],
     [(链接至[0,1],(链接至[1,1]),(c-b),(c-d),(c-e)],
     [(etc),(etc),(etc),(etc),(d-e)],
     ]

因此值不会存储两次。我正在使用相当多的值,所以对我来说它们没有存储两次真的很重要。 如果numpy不能支持这个,你对我如何解决这个问题有什么其他的建议吗?

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

这可能会按照您的意愿运作:

A = [i for i in range(10)]
B = [i for i in range(10,20)]

R = [ [ abs(a-b) for b in B[i-len(B):] ] for i,a in enumerate(A)  ]

如果您只需要A的第一列,那么您当然可以将其更改为

R = [ [ abs(a[0]-b) for b in B[i-len(B):] ] for i,a in enumerate(A)  ]     

但是我认为使用numpy可以提高性能,即使以两次计算所有内容为代价:

A = np.arange(10)
B = np.arange(10,20)

R = abs(A[:,None] - B[None,:])

将以C速度完成比赛。如果你真的需要做你提出的建议,你可能会想到Cython。