Python &引用;链表“;在numpy数组中?如何避免重复条目

Python &引用;链表“;在numpy数组中?如何避免重复条目,python,list,numpy,Python,List,Numpy,我现在在python中有一个列表列表,其中包含2D numpy数组的每个元素之间的一些计算结果。(我发现了2D数组中每个值之间的差异)。 为了提高效率,只需执行一次计算(因为X和Y之间的绝对差值对于X和Y都是相同的,所以只需计算一次) 我看了一遍,得到了一大串结果 为了给您一个想法,假设我正在使用数组中的一个变量: [ [a] ,{这里有其他内容(更多变量),但是可以忽略它们。} [b] ,~~ [c] ,~~ [d] ,~~ [e] ,~~ ] ^(其中a、b、c……为实际数字) 我需要找到这

我现在在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)],
]

但是请注意,由于我使用的是绝对差(例如,绝对_值(a-b)), 我不应该再看一遍清单,重新计算差异, 因为abs(a-b)与abs(b-a)相同

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

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

这样,值[1,2,3,4,5]只存储在柠檬中;橙色只是引用这些值。也就是说,这两个列表之间存在一个链接。 在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)],
[(等),(等),(等),(等),(d-e)],
]

所以值不会被存储两次。我处理的是大量的值,所以它们不会被存储两次对我来说真的很重要。 如果numpy不能支持这一点,你对我如何处理这一问题还有其他建议吗


谢谢您的时间。

这可能会按照您的要求工作:

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,:])

如果你真的需要按照你的建议去做,你可能会想到Cython。

这会更清楚(意味着你更有可能得到答案)如果您可以提供一个输入的小示例,作为复制粘贴可运行的Python代码和您的预期输出。目前,提供任何类型的答案都需要进行大量的猜测。这就是他们在警告您过早优化时所说的……您所描述的代码将会变慢(因为它将使用Python循环)和使用更多的内存(因为它将存储Python对象而不是原始的数值,而且指针占用的空间与它们将指向的值一样大),而不是您未经尝试就放弃的朴素numpy实现。如果您真的需要将操作减半,请查看。