在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))
有没有办法更有效地做到这一点?最好是内存分配很少。
答案 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
。