python – 对数组进行高效的双重迭代
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 对数组进行高效的双重迭代,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1984字,纯文字阅读大概需要3分钟。
内容图文
我有下面的代码,其中points是3行cols列表的列数,coorRadius是我想要找到局部坐标最大值的半径,localCoordinateMaxima是一个数组,我存储这些最大值的i:
for i,x in enumerate(points):
check = 1
for j,y in enumerate(points):
if linalg.norm(x-y) <= coorRadius and x[2] < y[2]:
check = 0
if check == 1:
localCoordinateMaxima.append(i)
print localCoordinateMaxima
不幸的是,当我有几千点时,这需要永远,我正在寻找一种加速它的方法.我尝试用all()条件来做,但是我没有管理它,我甚至不确定它会更有效率.你们能提出一种让它更快的方法吗?
最好!
解决方法:
您最好使用KDTree搜索邻居.
from scipy.spatial import cKDTree
tree = cKDTree(points)
pairs = tree.query_pairs(coorRadius)
现在,pair是一组两个项元组(i,j),其中i <i. 2小得多:="" <="" [i]和points="" [j]在彼此的coorradius之内.你现在可以简单地迭代这些,这可能比你当前迭代的len(points)**="" j和points="" p="">
is_maximum = [True] * len(points)
for i, j in pairs:
if points[i][2] < points[j][2]:
is_maximum[i] = False
elif points[j][2] < points[i][2]:
is_maximum[j] = False
localCoordinateMaxima, = np.nonzero(is_maximum)
这可以通过矢量化来进一步加速:
pairs = np.array(list(pairs))
pairs = np.vstack((pairs, pairs[:, ::-1]))
pairs = pairs[np.argsort(pairs[:, 0])]
is_z_smaller = points[pairs[:, 0], 2] < points[pairs[:, 1], 2]
bins, = np.nonzero(pairs[:-1, 0] != pairs[1:, 0])
bins = np.concatenate(([0], bins+1))
is_maximum = np.logical_and.reduceat(is_z_smaller, bins)
localCoordinateMaxima, = np.nonzero(is_maximum)
上面的代码假设每个点在coorRadius中至少有一个邻居.如果不是这样,你需要稍微复杂化一些事情:
pairs = np.array(list(pairs))
pairs = np.vstack((pairs, pairs[:, ::-1]))
pairs = pairs[np.argsort(pairs[:, 0])]
is_z_smaller = points[pairs[:, 0], 2] < points[pairs[:, 1], 2]
bins, = np.nonzero(pairs[:-1, 0] != pairs[1:, 0])
has_neighbors = pairs[np.concatenate(([True], bins)), 0]
bins = np.concatenate(([0], bins+1))
is_maximum = np.ones((len(points),), bool)
is_maximum[has_neighbors] &= np.logical_and.reduceat(is_z_smaller, bins)
localCoordinateMaxima, = np.nonzero(is_maximum)
内容总结
以上是互联网集市为您收集整理的python – 对数组进行高效的双重迭代全部内容,希望文章能够帮你解决python – 对数组进行高效的双重迭代所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。