创建没有特定范围的数组

时间:2012-03-03 12:09:04

标签: python numpy scipy list-comprehension

在python中,我numpy.ndarray调用了a和一个名为b的索引列表。我想得到a的所有值的列表,这些值不在b索引附近的-10..10位置。 这是我当前的代码,由于数据分配(a非常大),需要花费大量时间才能运行:

    aa=a
    # Remove all ranges backwards
    for bb in b[::-1]:
        aa=np.delete(aa, range(bb-10,bb+10))

有没有办法更有效地做到这一点?最好是内存分配很少。

2 个答案:

答案 0 :(得分:2)

np.delete将获取任意大小的一系列指标。您可以简单地填充整个指标数组并执行一次删除,因此只能解除分配并重新分配一次。 (没有经过测试。可能的拼写错误。)

bb = np.empty((b.size, 21), dtype=int)
for i,v in enumerate(b):
    bb[i] = v+np.arange(-10,11)

np.delete(a, bb.flat)  # looks like .flat is optional

注意,如果您的范围重叠,您将在此算法与算法之间产生差异:您的算法会删除多于最初10个索引的项目。

答案 1 :(得分:0)

你能找到一个你确定 不在a的数字,然后将b索引周围的所有索引设置为该数字,这样你可以在之后删除吗?

import numpy as np
for i in range(-10, 11):
    a[b + i] = number_not_in_a
values = set(np.unique(a)) - set([number_not_in_a])

此代码根本不会为a分配新的内存,只需要创建一个范围对象,并且在22个c优化的numpy操作中完成工作(如果计算{{1},则为43操作),以及将b + i返回数组转换为unique

的成本

请注意,如果set包含小于10的索引,则这些索引周围的b“区域”将环绕到数组的另一端。如果number_not_in_a包含大于b的索引,则操作将在某个时间点失败并显示len(a) - 11