基于ChatGPT生成的泊松圆盘采样代码 Python纯算法源码

先上代码直接运行

# -*- coding: utf-8 -*-
"""
--********************************************************************--
--file: 柏森采样示例代码
--author: donganning
--create time: 2023/3/30 14:24
--description: 
--********************************************************************--
"""
import random
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import PatchCollection
from scipy.stats import qmcdef get_possiom_sample_by_gpt(width, height, r, k=3000):"""使用gpt生成的代码1。 初始化采样点列表和边界框。采样点列表是用来存储已生成的采样点的数组,边界框是用来限制采样点的生成范围的矩形。2。 在边界框内随机生成一个起始采样点,并将其添加到采样点列表中。3。 对于每个已经生成的采样点,随机生成N个候选点(N取决于数据集的大小和维数),并判断它们是否满足一定的条件,如距离大于一定值D,没有与其他采样点重叠等。4。 如果一个候选点满足条件,将其添加到采样点列表中,并将其放入一个"活跃集合"中。"活跃集合"是一个队列,用来存储需要重新测试的采样点。当新的采样点被添加时,它会加入到"active_samples"的末端。5。 从"active_samples"中取出一个采样点,并对其周围的候选点进行测试。如果一个候选点满足条件,将其添加到采样点列表中,并将其放入"active_samples"中。6。 重复步骤5,直到"活跃集合"为空。当采样点列表达到预设数量时,停止采样。:param width: 宽度范围:param height: 高度范围:param r: 半径:param k: 采样次数:return:"""# Step1: Initialize variables and data structurescell = r / np.sqrt(2) # cell sizecols, rows = int(np.ceil(width / cell)), int(np.ceil(height / cell)) # number of columns and rowsgrid = [None] * (cols * rows) # grid to store pointssamples = [] # list of samplesactive_samples = [] # queue of active samples# Step2: Pick a random point and add it to the samples list and active_samples queuex = random.uniform(0, width)y = random.uniform(0, height)i = int(x / cell)j = int(y / cell)samples.append((x, y))active_samples.append((x, y))grid[i + j * cols] = x, y# Step3-6: Generate new sampleswhile active_samples:# Step5: Pick a random active sampleidx = random.randint(0, len(active_samples) -1)x, y = active_samples[idx]# Step3: Generate k new candidate samples randomlyfor _ in range(k):## gpt原始提供的用来生成随机点的方法,感觉不如random.random()劲# angle = random.uniform(0,2 * np.pi)# radius = random.uniform(r,2 * r)# new_x = x + radius * np.cos(angle)# new_y = y + radius * np.sin(angle)new_x = random.random()new_y = random.random()# Step4: Check if the new sample is inside the boundaryif (new_x >=0 and new_x <= width and new_y >=0 and new_y <= height):i = int(new_x / cell)j = int(new_y / cell)else:continue# intersect表示在新随机生成的样本点和旧样本点之间是否存在冲突,# 即新样本点是否与任何旧样本点过于接近。# 如果新样本点与任何旧样本点过于接近,则intersect会被设置为True,这将导致新样本点被舍弃。# 如果新样本点与所有旧样本点的距离都足够远,则intersect将保持为False,新样本点将被添加到样本列表中。intersect = False# Step4: Check if the new sample is too close to any existing samplefor dj in range(-2,3):for di in range(-2,3):if (i + di >=0 and i + di < cols and j + dj >=0 and j + dj < rows and grid[(i + di) + (j + dj) * cols]):dx = new_x - grid[(i + di) + (j + dj) * cols][0]dy = new_y - grid[(i + di) + (j + dj) * cols][1]dist = np.sqrt(dx * dx + dy * dy)if (dist < r):intersect = Truebreakif intersect:break# Step4: If the new sample is far enough from other samples, add it to the samples list and active_samples queueif not intersect:if grid[i + j * cols] == None:samples.append((new_x, new_y))active_samples.append((new_x, new_y))grid[i + j * cols] = new_x, new_y# Step6: Remove the sample from the active_samples queueif len(active_samples) >1:active_samples.pop(idx)else:active_samples = []# Step7: Return the list of samplesreturn np.array(samples)# https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.qmc.PoissonDisk.html
def get_possiom_sample(r, k=3000):"""qmc.PoissonDisk方法自带参数:param r: 半径:param k: 采样点个数:return:"""rng = np.random.default_rng()# d=2维度engine = qmc.PoissonDisk(d=2, radius=r, seed=rng)center_of_samples = engine.random(k)return center_of_samplesif __name__ == '__main__':# radius =np.sqrt(2)/2 # 调试gpt代码时候用的半径参数r = 0.2k = 2000# 用qmc.PoissonDisk方法sample = get_possiom_sample(r)print("采样完毕")# 用手撸代码方法# sample = get_possiom_sample_by_gpt(1,1,r,k)print("gpt采样完毕")# 画图fig, ax = plt.subplots()_ = ax.scatter(sample[:, 0], sample[:, 1])circles = [plt.Circle((xi, yi), radius=r / 2, fill=False)for xi, yi in sample]collection = PatchCollection(circles, match_original=True)ax.add_collection(collection)_ = ax.set(aspect='equal', xlabel=r'$x_1$', ylabel=r'$x_2$',xlim=[0, 1], ylim=[0, 1])plt.show()

基本概念

直接复制粘贴别人博客了
在这里插入图片描述

总的来说,该方法有这些好处

  1. 尽可能均匀地在一片区域上采样
  2. 由于使用画格子的算法,只需要遍历附近的格子,不用遍历全部,大大降低了计算复杂度。
    在这里插入图片描述

遇到问题

其实用qmc.PoissonDisk方法就能实现采样,但问题是公司服务器上是Python3.6,scipy版本1.5

根据ImportError: cannot import name ‘qmc’ from ‘scipy.stats’ 解决办法中提到,“qmc模块是在scipy的1.7.0版本(2021年7月左右)中添加的。 故需要更新软件包。

然而去Pypi官网看了一下,scipy 1.7至少得Python3.7去运行,因此没发通过直接倒入包的方式来调用了,只能根据算法原理手撸了。

感谢ChatGPT,实现了绝大部分代码,调试半天终于实现了几乎一样的采样功能。不得不说真的要被替代了。。。

参考

  1. 泊松圆盘采样(Poisson-Disk Sampling)
  2. scipy.stats.qmc.PoissonDisk
  3. ImportError: cannot import name ‘qmc’ from ‘scipy.stats’ 解决办法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25813.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IdentityServer 4 自定义身份校验/通过 token获取用户信息

Demo https://github.com/MartinAaron/data_collection 1、自定义身份校验 public static IEnumerable<Client> GetClients(){return new List<Client>{//grant_type basicnew Client{ClientId "xczx",AccessTokenLifetime 36000,AllowedGrantTypes G…

微信小程序登录 + 基于token的身份验证

官方时序图如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 图里其实说的很清楚了&#xff0c;清理下流程&#xff1a; 1.前端调用wx.login()获取code值 2.前端通过调用wx.getUserInfo获取iv、rawData、signature、e…

Token:用户身份验证的令牌

一、Token是什么 Token&#xff0c;就是用户身份验证的令牌&#xff0c;代表执行某些操作的权利的对象&#xff0c;本质上是服务端生成的一串加密字符串、用于客户端进行请求的“令牌”。 当用户第一次使用账号密码成功登 陆后&#xff0c;服务器就生成一个token和token失效…

调用华为API实现身份证识别

调用华为API实现身份证识别 1、作者介绍2、调用华为API实现身份证识别2.1 算法介绍2.1.1OCR简介2.1.2身份证识别原理2.1.3身份证识别应用场景 2.2 调用华为API流程 3、代码实现3.1安装相关的包3.2代码复现3.3实验结果 1、作者介绍 雷千龙&#xff0c;男&#xff0c;西安工程大…

二十二、身份验证与权限

一、 准备工作 为了讲清楚身份验证与权限&#xff0c;我们再创建一个应用projects,设计模型如下&#xff1a; class Project(models.Model):name models.CharField(项目名称, max_length20, help_text项目名称)desc models.CharField(项目描述, max_length200, help_text项目…

人脸核身基础版 SDK 接入 > 合作方后台上送身份信息

文章目录 一、概述二、实现流程2.1. 获取获取 access_token2.2. 获取 SIGN ticket2.3. 生成签名2.4. 上送身份信息2.5. 获取 NONCE ticket 三、实战3.1. 获取获取 access_token3.2. 获取 SIGN ticket3.3. 生成签名3.4. 上送身份信息3.5. 获取 NONCE ticket 四、开源地址 一、概…

身份证验证接口API(仅需一行代码,公安部实时接口)

身份确认在互联网越来越普及&#xff0c;在二手、电商、贷款、交友、招聘等主流互联网应用中都有明确的刚需&#xff0c;传统的 身份证核验方式是用户上传身份证图片&#xff0c;客服后台人肉审核&#xff0c;但问题在于根本无从确认身份证的真实性&#xff0c;也不能确认该身份…

危!GPT将影响80%工作岗位,挣得越多越危险?OpenAI发布重磅研究

源&#xff5c;新智元 GPT-4发布没几天&#xff0c;OpenAI直接告诉所有人&#xff0c;GPTs是通用技术&#xff0c;80%的美国人的工作受到影响。想要保命&#xff0c;且看这34大「铁饭碗」。 前脚刚推出GPT-4&#xff0c;OpenAI后脚就发布了35页论文官宣&#xff1a; 80%的美国人…

音视频技术开发周刊 | 286

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 比尔盖茨&#xff1a;AI 时代开启 盖茨谈到AI如何改善人类的不平等现象&#xff0c;并在医疗、教育等方面做出贡献&#xff0c;但也存在风险。 GPT-4 Copilot X震撼来袭&a…

对话 ClickHouse CTO Alexey:目光不仅限于成为最快的数据库 | 近匠

作为世界上最快的 OLAP 列式数据库之一&#xff0c;ClickHouse 能在毫秒级的时间内处理数百亿行的数据。ClickHouse 公司在官网上&#xff0c;也是简单扼要地介绍了自己的数据库&#xff1a;“Fast”。 ClickHouse 的灵魂人物 AlexeybMilovidov&#xff0c;则是一位将“慢”践行…

马斯克放话:没有我就没有 OpenAI,连名字都是我起的!

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 在 ChatGPT、GPT- 4 的爆火下&#xff0c;近来 OpenAI 这个名字已逐渐成为科技圈的“高频热词”&#xff0c;其创立初期与马斯克之间的“恩怨”也被时常提及。 有人说自从马斯克走后&#xff0c;Open…

阿里云版Chat-gpt申请内测

不允许你还不知道阿里云的chat-gpt&#xff0c;快去申请 -- 内测申请地址&#xff1a;通义千问

C++图像处理 -- 图像合成

阅读提示&#xff1a; 《C图像处理》系列以代码清晰&#xff0c;可读性为主&#xff0c;全部使用C代码。 《Delphi图像处理》系列以效率为侧重点&#xff0c;一般代码为PASCAL&#xff0c;核心代码采用BASM。 尽可能保持二者内容一致&#xff0c;可相互对照。 本文代码必须包括…

图像合成与图像融合

这一次我来给大家介绍一下图像合成与融合。 我们经常看到一些很奇妙的PS技术&#xff0c;例如下面这张&#xff0c;它把1928年的一位叫做Frankie Yale的黑帮老大被杀时的照片&#xff0c;与现在这栋房子的照片无缝融合在一起&#xff1a; 还有这张&#xff0c;将1945年柏林街道…

Chrome安装油猴插件详细教程

Chrome安装油猴插件详细教程 一、油猴安装方法 方法一&#xff1a;Google官方商店安装&#xff08;推荐&#xff0c;需要科学上网&#xff09; 方法二&#xff1a;本地安装&#xff08;无需科学上网&#xff0c;不会科学上网的适用&#xff09; 二、安装油猴插件 方法一&am…

Tampermonkey 油猴脚本,chrome插件

tampermonkey脚本是一款在谷歌浏览器上经常使用到的浏览器脚本插件&#xff0c;油猴脚本不仅为用户提供了大量的免费脚本插件外&#xff0c;而且还可以帮助你对这些脚本插件进行统一管理&#xff0c;当有最新版本的脚本推出的时候&#xff0c;它会帮助你进行自动更新。当然&…

手机上使用油猴插件 Tampermonkey

油猴 即 Tampermonkey中文名俗称油猴&#xff0c;是一款浏览器上的扩展&#xff0c;用户可以通过Tampermonkey添加和使用脚本&#xff0c;而脚本是一种可以修改网页JavaScript的程序。 在PC端&#xff0c;可以通过 Chrome浏览器的扩展程序&#xff0c;再结合 脚本 可以实现各种…

Tampermonkey油猴插件安装使用

Tampermonkey油猴插件安装使用 Tampermonkey油猴插件——安装与使用教程 Tampermonkey的crx文件&#xff0c;将下载下来的压缩包解压出来&#xff0c;其中类型为CRX文件 就是接下来需要用到的安装文件 打开浏览器设置&#xff0c;打开扩展程序页面&#xff0c;或者直接搜索Chr…

关于油猴(Tampermonkey)

油猴Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c;它适用于多款常见的浏览器。 前言 那么&#xff0c;油猴具体能干啥&#xff1f; 它可以让我们使用浏览器时更加便捷。 比如说&#xff0c;对于一些网页限制的解除&#xff0c;某度盘文件直接…

Tampermonkey油猴插件——安装与使用教程

安装步骤&#xff1a; Tampermonkey 是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c;它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox。 油猴插件下载网址&#xff1a;Tampermonkey • Home Beta是测试版&#xff1b; Stable是稳定版&am…