我有像 [1,1,1,1,3,3,3] 这样的 ndarray。
我希望,如果像示例中的情况一样存在具有相同值的连续元素,则相同链的内容会以这种方式修改:我们将 delta 计算为相同值的 0.1%,将其减去第一个链的元素并将其添加到最后,在示例中得到: [0.9999,1,1,1.0001,2.9997,3,3.0003].
然后我想进一步修改链内的值,使距离平衡。例如,0.9999 和 1.0001 之间的距离为 0.0002,链中总共有 4 个元素,因此 0.0002/(4-1) = 0.000067。最后我得到 [0.9999, 0.999967, 1.000034, 2.9997, 3, 3.0003]。
我该怎么做? 我尝试使用这个简单的代码只是为了修改极端情况,但它不起作用:
def modify_extremes(arr):
modified_arr = arr.astype(float)
# Find indices where consecutive elements are not equal
indices = np.where(np.diff(arr) == 0)[0] + 1
# Iterate over the found indices and modify extremes
for i in indices:
modified_arr[i - 1] += 0.01
modified_arr[i] -= 0.01
return modified_arr
您可能需要两个函数:一个用于分割连续整数,另一个用于插入值。这就是分割连续整数的方法:
def split_consecutive_ints(lst):
result = []
current_group = [lst[0]]
for i in range(1, len(lst)):
if lst[i] == lst[i - 1]:
current_group.append(lst[i])
else:
result.append(current_group)
current_group = [lst[i]]
result.append(current_group)
return result
这是在列表中插入值的方法:
def interpolate_values(lst):
first = lst[0]
last = lst[-1]
num_elements = len(lst)
interpolated_values = [
first + (last - first) * i / (num_elements - 1) for i in range(num_elements)
]
return interpolated_values
这就是如何用整数调用列表上的这些函数:
x = [1, 1, 1, 1, 3, 3, 3, 4, 5, 5, 5, 5, 5]
new_x = []
chunks = split_consecutive_ints(x)
for chunk in chunks:
if len(chunk) > 1:
chunk[0] -= 0.01
chunk[-1] += 0.01
new_x.append(interpolate_values(chunk))
else:
new_x.append(chunk)
# >>> new_x
# >>> [[0.99, 0.9966666666666667, 1.0033333333333334, 1.01], [2.99, 3.0, 3.01], [4], [4.99, 4.995, 5.0, 5.005, 5.01]]