0

numpy.core.memmap.memmap我有两个名为dataand的大型数组new_data,其中包含 > 700 万个 float32 项。

我需要在我目前正在这样做的同一个循环中对它们进行迭代。

for i in range(0,len(data)):
  if new_data[i] == 0: continue
  combo = ( data[i], new_data[i] )
  if not combo in new_values_map: new_values_map[combo] = available_values.pop()
  data[i] = new_values_map[combo]

然而,这是不合理的慢,所以我认为使用 numpy 的矢量化函数是要走的路。

是否可以使用索引进行矢量化 - 以便矢量化数组可以将其项目与另一个数组中的相应项目进行比较?

我想过压缩这两个数组,但我想这会导致准备工作不合理的开销?

还有其他方法可以优化此操作吗?

对于上下文:目标是有效地合并两个数组,以便两个数组之间对应值的每个唯一组合由结果数组中的不同值表示,除了 new_data 数组中的零被忽略。数组代表 3D 位图图像。

编辑:available_values是一组尚未使用的值,data并且在对该循环的调用中持续存在。new_values_map另一方面,在每次使用此循环之前将其重置为空字典。

EDIT2:数据数组只包含整数,即:它被初始化为零,然后每次使用这个循环时都会使用不同new_data的值填充更多的值,available_values这些值最初是一个整数范围。new_data理论上可以是任何东西。

4

3 回答 3

2

在回答您有关矢量化的问题时,答案可能是肯定的,尽管您需要澄清available_values包含什么以及如何使用它,因为这是矢量化的核心。

您的解决方案可能看起来像这样......

indices = new_data != 0

data[indices] = available_values

在这种情况下,如果available_values可以将其视为一组值,其中我们将第一个值分配给data其中 new_data 不为 0 的第一个值,只要available_values是一个 numpy 数组,它应该可以工作。

假设取值 0-255,那么您可以为 new_data 和 data 中的每对可能的值构造一个new_data具有唯一条目的数组,如下所示:dataavailable_values

available_data = numpy.array(xrange(0, 255*255)).reshape((255, 255))
indices = new_data != 0
data[indices] = available_data[data[indices], new_data[indices]]

显然,available_data可以是您想要的任何映射。上面的内容应该非常快available_data(特别是如果你只构建available_data一次)。

于 2013-03-11T12:09:47.250 回答
0

似乎替换前两行循环以产生:

for i in numpy.where(new_data != 0)[0]:
  combo = ( data[i], new_data[i] )
  if not combo in new_values_map: new_values_map[combo] = available_values.pop()
  data[i] = new_values_map[combo]

有想要的效果。

因此,循环中的大部分时间都花在遇到new_data. 真的不明白为什么这么多空迭代如此昂贵,也许有一天我会......

于 2013-03-11T14:04:06.340 回答
0

Python 为您提供了处理大型数据数组的强大工具:生成器迭代器

基本上,它们将允许访问您的数据,因为它们是常规列表,而不是一次将它们提取到内存中,而是逐个访问。

如果一次访问两个大数组,您可以

for item_a, item_b in izip(data, new_data):
   #... do you stuff here

izip创建了一个迭代器,它一次迭代数组的元素,但它会根据需要选择片段,而不是一次全部。

于 2013-03-11T12:18:10.360 回答