我现在在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不能支持这个,你对我如何解决这个问题有什么其他的建议吗?
感谢您的时间。
答案 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。