gpt4 book ai didi

python - 创建一个循环,在数据集的所有项目上运行函数(参数是数据集的索引)?

转载 作者:太空宇宙 更新时间:2023-11-03 14:29:22 25 4
gpt4 key购买 nike

所以我有一个函数:

def connection(n,m,r):
is_connected = ((x[n]-x[m])**2 + (y[n]-y[m])**2)**0.5
if is_connected < 2*r:
return n + " " + "connects with" + " " + m
else:
return "no connection"

这基本上可以看出两个圆(坐标对应于索引 n 和 m)是否相连。 n 和 m 参数指的是数据集 x 和 y 中的索引,它们来自一个 numpy.random 数组:

array([[ 0.31730234,  0.73662906],
[ 0.54488759, 0.09462212],
[ 0.07500703, 0.36148366],
[ 0.33200281, 0.04550565],
[ 0.3420866 , 0.9425797 ],
[ 0.36115391, 0.16670599],
[ 0.95586938, 0.52599398],
[ 0.13707665, 0.6574444 ],
[ 0.77766138, 0.56875582],
[ 0.79618595, 0.7139309 ]])

由于数组基本上是 10 组坐标,我从中生成了两个列表,x 和 y(x 是数组的第一列,y 是第二列)。 m 和 n 是这些列表中的索引。因此,n 和 m 对应于数组中的索引,但我不确定如何?

我现在一直在做的是手动输入索引以查看此数组中的任何两个圆圈是否连接 - 是否有 -for 循环可以更有效地执行此操作?

最佳答案

无论如何,你应该以不同的方式做事。不幸的是,速度快得多的 cKDTree 没有必要的功能,但即使是其他 KDTree 也应该给你一个巨大的速度提升(并更优雅地解决它)

from scipy.spatial import KDTree
from itertools import chain

tree = KDTree(circles)

# unfortunatly only a list of lists, because there may be a different amount
# also the point itself is included every time.
connections = tree.query_ball_tree(tree, 2*r)

# if all you want is a list of lists of what connects with what
# connections is already what you need. The rest creates a connectivity matrix:

repeats = [len(l) for l in connections]
x_point = np.arange(len(circles)).repeat(repeats)
y_point = np.fromiter(chain(*connections), dtype=np.intp)

# or construct a sparse matrix here instead, scipy.sparse has some graph tools
# maybe it even has a better thing to do this.
connected = np.zeros((len(circles),) * 2, dtype=bool)
connected[x_point, y_point] = True

虽然不幸的是它没有使用 cKDTree,但这仍然为您节省了 O(N^2) 的复杂性...当然如果 len(circles ) 很小,没关系,但是你可以只使用广播,(或者 scipy.spatial 中的 distance_matrix):

distances = np.sqrt(((circles[:,None,:] - circles)**2).sum(-1))
connected = distances < (2 * r)

# if you need the list of lists/arrays here you can do:
connections = [np.flatnonzero(c) for c in connected]

但请注意,第二种方法是一个内存饥饿的怪物,只有在 circles 很小的情况下才有用。

关于python - 创建一个循环,在数据集的所有项目上运行函数(参数是数据集的索引)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com