【发布时间】:2016-12-06 01:26:29
【问题描述】:
我有两个数组命名为 u,v, 例如
u=np.array([1.0,2.0,2.0,3.0,4.0])
v=np.array([10.0,21.0,18.0,30.0,40.0])
a=np.array([100.0,210.0,220.0,300.0,400.0])
如果 u 中的两个元素相同,则删除 v 值较高的那个。 对于上面的例子,结果应该是
u_new=np.array([1.0,2.0,3.0,4.0])
v_new=np.array([10.0,18.0,30.0,40.0])
a_new=np.array([100.0,220.0,300.0,400.0])
def remove_duplicates(u,v,a):
u_new, indices = np.unique(u, return_index=True)
v_new = np.zeros(len(u_new), dtype=np.float64)
a_new = np.zeros(len(u_new), dtype=np.float64)
for i in range(len(indices)):
j1 = indices[i]
if i < len(indices) - 1:
j2 = indices[i + 1]
else:
j2 = j1 + 1
v_new[i] = np.amin(v[j1:j2])
k = np.argmin(v[j1:j2]) + j1
a_new[i] = a[k]
return u_new,v_new,a_new
上面的代码在处理浮点数时存在问题,因为两个浮点数之间不完全相等。所以我不得不把它改成一种非常“愚蠢”的方式
def remove_duplicates(u, v, a):
u_new=u
v_new=v
a_new=a
cnt = 0
for i in range(len(u)):
if cnt <1:
u_new[cnt] = u[i]
v_new[cnt] = v[i]
a_new[cnt] = a[i]
cnt += 1
else:
if abs(u[i]-u_new[cnt-1]) > 1e-5:
u_new[cnt] = u[i]
v_new[cnt] = v[i]
a_new[cnt] = a[i]
cnt += 1
else:
print("Two points with same x coord found.ignore", i)
if v_new[cnt-1] > v[i]:
v_new[cnt-1] = v[i]
a_new[cnt-1] = a[i]
return u_new[:cnt], v_new[:cnt], a_new[:cnt]
如何以 Python 方式对其进行编程? 谢谢。
【问题讨论】:
-
通过循环前两个数组来构造一个新数组对我来说似乎是最可行的。我认为没有就地操作是可取的。
-
感谢您的评论。我想要更多类似 python 的代码来执行此操作,因为我认为数组上的循环很耗时。
-
数组是否总是一维并按照您的示例排序?
-
是的,它们总是一维数组。
标签: python numpy duplicates element