【发布时间】: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。