相关疑难解决方法(0)

两个不同Numpy阵列中点之间的最小欧几里德距离,而不是在

我有两个x - y坐标数组,我想找到一个数组中每个点与另一个数组中所有点之间的最小欧几里德距离.阵列的大小不一定相同.例如:

xy1=numpy.array(
[[  243,  3173],
[  525,  2997]])

xy2=numpy.array(
[[ 682, 2644],
[ 277, 2651],
[ 396, 2640]])
Run Code Online (Sandbox Code Playgroud)

我目前的方法遍历每个坐标xyxy1计算之间的协调距离和其他坐标.

mindist=numpy.zeros(len(xy1))
minid=numpy.zeros(len(xy1))

for i,xy in enumerate(xy1):
    dists=numpy.sqrt(numpy.sum((xy-xy2)**2,axis=1))
    mindist[i],minid[i]=dists.min(),dists.argmin()
Run Code Online (Sandbox Code Playgroud)

有没有办法消除for循环,并以某种方式在两个数组之间进行逐元素计算?我设想生成一个距离矩阵,我可以在其中找到每行或每列中的最小元素.

另一种看待问题的方法.假设我将xy1(长度为m)和xy2(长度为p)连接成xy(长度为n),并存储原始数组的长度.从理论上讲,我应该能够从那些我可以获取mxp子矩阵的坐标生成一个nxn距离矩阵.有没有办法有效地生成这个子矩阵?

python numpy euclidean-distance

39
推荐指数
5
解决办法
3万
查看次数

放置随机圆圈而不重叠(并且不使用强力)?

我刚刚提交了一个Java作业,我需要在屏幕上随机绘制一些圆圈作为游戏的一部分.给我们的挑战之一是确保没有任何圆圈重叠.我最终采用了一种奇怪的方法(因为我想:D)基本上只是使用trig从屏幕中心创建了一个模式,这很有趣.虽然这种方法中的圆圈从不重叠,但它并不理想......圆圈的分布在屏幕中间相当紧凑,角落中使用的空间非常小.

我还创建了一个(注释掉的)蛮力方法,如果拟议的圆的x,y坐标与已经创建的圆相交,则简单地重新滚动新坐标,虽然理论上能够循环到无限,但最有可能不会超过十个交叉点.

在与朋友讨论解决方案后(以及谷歌搜索引擎优化)后,我们真的非常有兴趣看看如何在没有蛮力的情况下完成这项工作.要求:

  • 在640x480窗口上绘制20个半径为十个单位的圆
  • 绝对没有圆圈重叠
  • 否则在屏幕上随机分布

可能,使用标准库?

java

17
推荐指数
1
解决办法
4031
查看次数

在python中使用点均匀随机填充磁盘的方法

我有一个应用程序,需要一个以准随机方式填充'n'点的磁盘.我希望这些点有点随机,但在磁盘上仍然具有或多或少的常规密度.

我当前的方法是放置一个点,检查它是否在磁盘内,然后检查它是否也远离已经保留的所有其他点.我的代码如下:

import os
import random
import math

# ------------------------------------------------ #
# geometric constants
center_x = -1188.2
center_y = -576.9
center_z = -3638.3

disk_distance = 2.0*5465.6
disk_diam = 5465.6

# ------------------------------------------------ #

pts_per_disk = 256
closeness_criteria = 200.0
min_closeness_criteria = disk_diam/closeness_criteria

disk_center = [(center_x-disk_distance),center_y,center_z]
pts_in_disk = []
while len(pts_in_disk) < (pts_per_disk):
    potential_pt_x = disk_center[0]
    potential_pt_dy = random.uniform(-disk_diam/2.0, disk_diam/2.0)
    potential_pt_y = disk_center[1]+potential_pt_dy
    potential_pt_dz = random.uniform(-disk_diam/2.0, disk_diam/2.0)
    potential_pt_z = disk_center[2]+potential_pt_dz
    potential_pt_rad = math.sqrt((potential_pt_dy)**2+(potential_pt_dz)**2)

    if potential_pt_rad < (disk_diam/2.0):
        far_enough_away = True
        for pt …
Run Code Online (Sandbox Code Playgroud)

python random algorithm

10
推荐指数
3
解决办法
2971
查看次数

标签 统计

python ×2

algorithm ×1

euclidean-distance ×1

java ×1

numpy ×1

random ×1