【问题标题】:"Linked lists" in numpy array? How to avoid duplicate entriesnumpy数组中的“链接列表”?如何避免重复条目
【发布时间】:2014-02-27 11:33:58
【问题描述】:

我现在在 python 中有一个列表列表,其中包含 2D numpy 数组的每个元素之间的一些计算结果。 (我发现了二维数组中每个值之间的差异)。 为了提高效率并且只执行一次此计算(由于 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]
.>>> 橙子= [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 不能支持这一点,你对我如何解决这个问题有任何其他建议吗?

感谢您的宝贵时间。

【问题讨论】:

  • 如果您可以提供一个输入的小示例作为可复制粘贴可运行的 Python 代码和您的预期输出,这将更加清晰(意味着您更有可能得到答案)。就目前而言,提供任何类型的答案都需要进行大量猜测。
  • 这就是他们在警告您过早优化时所谈论的内容...您所描述的代码将变慢(因为它将使用 Python 循环)并使用更多内存(因为它会存储 Python 对象而不是原始数字值,并且无论如何指针占用的空间与它们将指向的值一样多)比您在没有尝试的情况下丢弃的幼稚 numpy 实现。如果您确实需要将操作减半,请查看scipy.spatial.distance.pdist

标签: python list numpy


【解决方案1】:

这可能会如你所愿:

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。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 2017-12-09
    • 2023-03-22
    • 2014-06-17
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多