【发布时间】:2022-01-21 02:24:57
【问题描述】:
给定一个索引列表(偏移值),根据该列表拆分一个 numpy 数组,我想对其进行调整,以便在重复值上不会发生拆分。 这意味着重复值将仅在一个块中。
我已经编写了以下代码,它给出了结果,但我并不为此感到非常自豪。我想留在 numpy 世界中,并尽可能多地使用向量化的 numpy 函数。
但要检查索引(偏移值),我使用for 循环,并将结果存储在列表中。
你知道如何矢量化第二部分吗?
如果这有帮助,ar 是一个有序数组。
(我没有在下面的代码中使用此信息)。
import numpy as np
import vaex as vx
ar = np.array([8,8,8,10,11,11,13,14,15,15,18,19,20,21,22,22,22,22,22,22])
offsets = np.array([0,2,4,9,11,13,15,len(ar)])
_, unique_ind = np.unique(ar, return_index=True, return_inverse=False)
dup_ind = np.diff(unique_ind, append=len(ar))
dup_start = unique_ind[dup_ind > 1]
dup_end = dup_start + dup_ind[dup_ind > 1]
print(f'initial offsets: {offsets}')
#print(f'dup start: {dup_start}')
#print(f'dup end: {dup_end}')
temp = []
for off in offsets:
for ind in range(len(dup_start)):
if off > dup_start[ind] and off < dup_end[ind]:
off = dup_start[ind]
break
temp.append(off)
# Remove duplicates
offsets = list(dict.fromkeys(temp))
print(f'modified offsets: {offsets}')
结果
initial offsets: [ 0 2 4 9 11 13 15 20]
modified offsets: [0, 4, 8, 11, 13, 14, 20]
【问题讨论】: