【发布时间】:2015-06-16 11:52:01
【问题描述】:
我有一个包含 N 点坐标的数组。另一个数组包含这 N 个点的质量。
>>> import numpy as np
>>> N=10
>>> xyz=np.random.randint(0,2,(N,3))
>>> mass=np.random.rand(len(xyz))
>>> xyz
array([[1, 0, 1],
[1, 1, 0],
[0, 1, 1],
[0, 0, 0],
[0, 1, 0],
[1, 1, 0],
[1, 0, 1],
[0, 0, 1],
[1, 0, 1],
[0, 0, 1]])
>>> mass
array([ 0.38668401, 0.44385111, 0.47756182, 0.74896529, 0.20424403,
0.21828435, 0.98937523, 0.08736635, 0.24790248, 0.67759276])
现在我想获得一个具有唯一 xyz 值的数组和一个相应的总质量数组。这意味着以下数组:
>>> xyz_unique
array([[0, 1, 1],
[1, 1, 0],
[0, 0, 1],
[1, 0, 1],
[0, 0, 0],
[0, 1, 0]])
>>> mass_unique
array([ 0.47756182, 0.66213546, 0.76495911, 1.62396172, 0.74896529,
0.20424403])
我的尝试是以下带有双 for 循环的代码:
>>> xyz_unique=np.array(list(set(tuple(p) for p in xyz)))
>>> mass_unique=np.zeros(len(xyz_unique))
>>> for j in np.arange(len(xyz_unique)):
... indices=np.array([],dtype=np.int64)
... for i in np.arange(len(xyz)):
... if np.all(xyz[i]==xyz_unique[j]):
... indices=np.append(indices,i)
... mass_unique[j]=np.sum(mass[indices])
问题是这需要太长时间,我实际上有 N=100000。 有没有更快的方法或如何改进我的代码?
编辑 我的坐标实际上是浮点数。为了简单起见,我制作了随机整数以在低 N 处有重复。
【问题讨论】:
-
这看起来很有趣.. 接受的答案非常快速地创建唯一值的索引,但我丢失了有关重复值的信息。所以很难重建之后总结哪些质量值。或者我应该仔细考虑哪个答案?
标签: python arrays for-loop optimization numpy