小编sol*_*lub的帖子

在Python中实现“波浪折叠函数”算法的问题

简而言之:

我在Python 2.7中执行Wave Collapse Function算法的实现存在缺陷,但是我无法确定问题所在。我需要帮助来找出我可能会丢失或做错的事情。

什么是波崩函数算法?

它是Maxim Gumin在2016年编写的一种算法,可以从样本图像生成程序模式。您可以在此处(2D重叠模型)和此处(3D切片模型)看到它的实际效果。

实施目标:

将算法(2D重叠模型)简化为本质,并避免原始C#脚本的冗长和笨拙(令人惊讶的是,它很长且难以阅读)。这是尝试使该算法更短,更清晰和pythonic版本。

此实现的特征:

我正在使用处理(Python模式),这是一种用于视觉设计的软件,可简化图像处理(没有PIL,没有Matplotlib等)。主要缺点是我仅限于Python 2.7,并且无法导入numpy。

与原始版本不同,此实现:

  • 不是面向对象的(处于当前状态),因此更易于理解/更接近伪代码
  • 使用一维数组而不是二维数组
  • 使用数组切片进行矩阵处理

算法(据我了解)

1 /读取输入位图,存储每个NxN模式并计数它们的出现。(可选:具有旋转和反射的增强图案数据。)

例如,当N = 3时:

在此处输入图片说明

2 /预计算并存储模式之间的所有可能的邻接关系。在下面的示例中,图案207、242、182和125可以与图案246的右侧重叠

在此处输入图片说明

3 /创建一个具有输出尺寸的数组(称为Wwave)。这个阵列的每个元素是一个数组保持状态(TrueFalse每个图案的)。

例如,假设我们在输入中计算了326个唯一模式,并且希望输出尺寸为20 x 20(400个单元)。然后,“ Wave”数组将包含400个(20x20)数组,每个数组包含326个布尔值。

开始时,所有布尔值都设置为,True因为在Wave的任何位置都允许使用每个模式。

W = [[True for pattern in xrange(len(patterns))] for cell in xrange(20*20)]
Run Code Online (Sandbox Code Playgroud)

4 /使用输出的尺寸创建另一个数组(称为H)。该数组的每个元素都是一个浮点数,在输出中保留其对应单元格的“熵”值。

此处的熵是指香农熵,它是根据Wave中特定位置的有效模式数量来计算的。单元格的有效模式(True在Wave中设置为)越多,其熵就越高。 …

python algorithm markov-chains procedural-generation

52
推荐指数
2
解决办法
966
查看次数

如何根据他们理想的社区程度重新订购单位?(进行中)

我需要帮助来实现一个允许生成建筑计划的算法,我最近在阅读Kostas Terzidis教授的最新出版物:排列设计:建筑,文本和上下文(2014)时偶然发现了这一点.

CONTEXT

  • 考虑一个分为网格系统(a)的站点(b).
  • 让我们考虑一个位于场地(c)范围内的空间列表和一个邻接矩阵来确定这些空间的放置条件和相邻关系(d)

在此输入图像描述

引用Terzidis教授:

"解决这个问题的一种方法是随机地在网格中放置空格,直到所有空间都合适并且满足约束条件"

上图显示了这样的问题和样本解决方案(f).

算法(如书中简要描述)

1 /"每个空格都与一个列表相关联,该列表包含根据其所需邻域的程度排序的所有其他空格."

2 /"然后从列表中选择每个空间的每个单元,然后逐个放置在站点中,直到它们适合站点并满足相邻条件.(如果失败,则重复该过程)"

九个随机生成计划的示例:

在此输入图像描述

我应该补充一点,作者后来解释说这个算法不依赖于暴力技术.

问题

如您所见,解释相对模糊,第2步相当不清楚(在编码方面).到目前为止我所有的都是"拼图":

  • "网站"(所选整数列表)
  • 邻接矩阵(嵌套列表)
  • "空格"(列表字典)

每个单位:

  • 返回其直接邻居的函数
  • 它的理想邻居列表,其索引按排序顺序排列
  • 基于其实际邻居的健康分数

    from random import shuffle
    
    n_col, n_row = 7, 5
    to_skip = [0, 1, 21, 22, 23, 24, 28, 29, 30, 31]
    site = [i for i in range(n_col * n_row) if i not in to_skip]
    fitness, grid = [[None if i in to_skip else [] for i in range(n_col * …
    Run Code Online (Sandbox Code Playgroud)

python processing permutation

31
推荐指数
1
解决办法
757
查看次数

使用 SAT 求解器 (Python) 查找特定区域内的所有自由多联骨牌组合

我是 SAT 求解器的新手,需要一些有关以下问题的指导。

考虑到:

? 我在 4*4 网格中选择了 14 个相邻的单元格

? 我有 5 个多联骨牌(A、B、C、D、E),大小分别为 4、2、5、2 和 1

? 这些多联骨是自由的,即它们的形状不是固定的,可以形成不同的图案。

在此处输入图片说明

如何使用 SAT 求解器计算所选区域(灰色单元格)内这 5 个自由多联骨牌的所有可能组合

借用@spinkus 有见地的答案和 OR-tools 文档,我可以制作以下示例代码(在 Jupyter Notebook 中运行):

from ortools.sat.python import cp_model

import numpy as np
import more_itertools as mit
import matplotlib.pyplot as plt
%matplotlib inline


W, H = 4, 4 #Dimensions of grid
sizes = (4, 2, 5, 2, 1) #Size of each polyomino
labels = np.arange(len(sizes))  #Label of each …
Run Code Online (Sandbox Code Playgroud)

python combinations constraint-programming z3 or-tools

18
推荐指数
2
解决办法
1452
查看次数

景深:将点着色器与模糊着色器组合(处理3)

我想在具有景深效果的3D画布(处理中)上显示数千个点.更具体地说,我想使用z缓冲区(深度缓冲)来调整point基于其与相机的距离的模糊水平.

到目前为止,我可以提出以下点着色器:

pointfrag.glsl

#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif

varying vec4 vertColor;
uniform float maxDepth;

void main() {

  float depth = gl_FragCoord.z / gl_FragCoord.w;
  gl_FragColor = vec4(vec3(vertColor - depth/maxDepth), 1) ;

}
Run Code Online (Sandbox Code Playgroud)

pointvert.glsl

uniform mat4 projection;
uniform mat4 modelview;

attribute vec4 position;
attribute vec4 color;
attribute vec2 offset;


varying vec4 vertColor;
varying vec4 vertTexCoord;

void main() {
  vec4 pos = modelview * position;
  vec4 clip = projection * pos;

  gl_Position = clip + projection * …
Run Code Online (Sandbox Code Playgroud)

processing shader depth-buffer fragment-shader gaussianblur

10
推荐指数
1
解决办法
878
查看次数

将 pypy3 设置为 Jupyter Notebook 的内核时出现问题

我在尝试为 Windows 10 机器上的 Jupyter Notebook 设置 pypy3 内核时遇到问题。

按照这 2 个其他相关线程 ( 1 , 2 ) 的说明,我已经使用ipykernel了该命令,pypy3 -m pip install ipykernel但似乎安装在某些时候遇到了错误:

Collecting ipykernel
  Using cached ipykernel-5.2.1-py3-none-any.whl (118 kB)
Collecting ipython>=5.0.0
  Using cached ipython-7.14.0-py3-none-any.whl (782 kB)
Collecting traitlets>=4.1.0
  Using cached traitlets-4.3.3-py2.py3-none-any.whl (75 kB)
Collecting jupyter-client
  Using cached jupyter_client-6.1.3-py3-none-any.whl (106 kB)
Collecting tornado>=4.2
  Using cached tornado-6.0.4.tar.gz (496 kB)
Requirement already satisfied: setuptools>=18.5 in c:\pypy3\site-packages (from ipython>=5.0.0->ipykernel) (44.0.0)
Collecting jedi>=0.10
  Using cached jedi-0.17.0-py2.py3-none-any.whl (1.1 MB)
Collecting decorator
  Using …
Run Code Online (Sandbox Code Playgroud)

python pypy pywin32 jupyter jupyter-notebook

8
推荐指数
1
解决办法
556
查看次数

我的 Davies-Bouldin 索引的 python 实现正确吗?

我正在尝试用Python计算Davies-Bouldin 指数。

以下是下面的代码尝试重现的步骤。

5 个步骤

  1. 对于每个簇,计算每个点到质心之间的欧氏距离
  2. 对于每个簇,计算这些距离的平均值
  3. 对于每对簇,计算它们质心之间的欧氏距离

然后,

  1. 对于每对簇,求其到各自质心的平均距离之和(在步骤 2 中计算),并将其除以它们之间的距离(在步骤 3 中计算)。

最后,

  1. 计算所有这些划分(=所有索引)的平均值以获得整个聚类的 Davies-Bouldin 索引

代码

def daviesbouldin(X, labels, centroids):

    import numpy as np
    from scipy.spatial.distance import pdist, euclidean
    
    nbre_of_clusters = len(centroids) #Get the number of clusters
    distances = [[] for e in range(nbre_of_clusters)] #Store intra-cluster distances by cluster
    distances_means = [] #Store the mean of these distances
    DB_indexes = [] #Store Davies_Boulin index of each pair of cluster
    second_cluster_idx = [] #Store index of …
Run Code Online (Sandbox Code Playgroud)

python statistics metrics cluster-analysis data-science

5
推荐指数
1
解决办法
9877
查看次数

在处理中旋转、反转和平移 PShape 对象

我想:

  • 多次平移反转旋转单个四边形(PShape 对象)
  • 然后更改其两个顶部顶点之一的高度

因此整个东西就像一个铰接臂,可以 向右或向左弯曲。

为了尽可能清晰,我制作了一些图表。

在此输入图像描述


在此输入图像描述


在此输入图像描述


在此输入图像描述


在此输入图像描述

我知道我可以:

  • 使用平移四边形translate()
  • 翻转(反转)它scale(1, -1)
  • 使用atan2()函数旋转它

在此输入图像描述

问题

当将这 3 个结合在一起时,我得到了这样的结果:

https://media.giphy.com/media/lkACPOxBLOhtk20gzD/giphy.gif

旋转角度似乎是正确的,但显然平移有问题(无论是在 X 轴还是 Y 轴上),我无法弄清楚到底是什么。

我怀疑枢轴翻译缺失,或者转换顺序不正确(或者两者都有)。

如果有人能帮助我理解我做错了什么以及如何解决这个问题,我将非常感激。

int W = 40;
int H = 40;
int offset = 10; 

float[] p0 = {-W/2, -H/2};
float[] p1 = {-W/2,  H/2};
float[] p2 = {W/2, H/2};
float[] p3 = {W/2, -H/2 - offset};

PShape object;


void setup(){
    size(600, 600, P2D);
    smooth(8); …
Run Code Online (Sandbox Code Playgroud)

processing geometry transform rotation

5
推荐指数
1
解决办法
468
查看次数

如何使用直骨架计算多边形的斜接偏移

我有一个用 Python 实现的 Straight Skeleton 算法,并想用它来偏移多边形的边缘。

在此处输入图片说明

不幸的是,我看到几篇论文提出了这种抵消方法,但没有一篇提供有关如何实现它的具体信息。他们之中:

由于直骨架的定义基于边缘的连续波前或草火传播,因此它特别适用于多边形偏移。特别是,它可以用来获得所谓的“斜接”偏移,如果角在偏移多边形中保持原样

如果 P 的骨架已知,那么对于任何给定半径 r 的单个偏移曲线的计算是简单、高效(线性时间)和数值稳定的。所要做的就是以某种方式遍历骨架 并逐个插入偏移曲线的元素。

我尝试将每个边的偏移量限制到它们周围的“骨骼”,但发现输出并不令人满意:一些偏移量不匹配,我看到线条应该相互接触的间隙。

在此处输入图片说明

这里质量更高)

在此处输入图片说明

问题:使用直骨架计算多边形斜接偏移的正确方法是什么?

python algorithm geometry offset computational-geometry

5
推荐指数
1
解决办法
840
查看次数

如何使用 Pandas 将多索引系列连接到单个索引数据帧?

考虑以下单索引 DataFrame:

      energy    fat
1      2000      28
2      1900      17
3      2200      30
4      1750      15
5      1800      18
6      1600      12
Run Code Online (Sandbox Code Playgroud)

我还有一个多索引系列:

1  vitamin-c    0.0004
   vitamin-a    0.0150
2  vitamin-c    0.0030
3  vitamin-d    1.2000
   vitamin-e    1.0007
   vitamin-c    1.2020
4  vitamin-a    0.0780
5  vitamin-b    0.9650
6  vitamin-e    1.9801
   vitamin-c    1.0011
Run Code Online (Sandbox Code Playgroud)

我怎样才能将两者结合起来,结果如下所示:

      energy    fat          vitamins
1      2000      28     vitamin-c    0.0004
                        vitamin-a    0.0150
2      1900      17     vitamin-c    0.0030
3      2200      30     vitamin-d    1.2000
                        vitamin-e    1.0007
                        vitamin-c    1.2020
4      1750      15     vitamin-a    0.0780
5 …
Run Code Online (Sandbox Code Playgroud)

python join multi-index dataframe pandas

4
推荐指数
1
解决办法
6079
查看次数

如何计算聚类的量化误差?

我想使用量化误差来测量聚类的质量,但找不到有关如何计算此指标的任何明确信息。

我发现的少数文件/文章是:

关于第三个链接(这是迄今为止我找到的最好的信息),我不知道如何解释计算(参见下面的代码片段):

(# 注释是我的。问号表示我不清楚的步骤)

def quantization_error(self):
        """
        This method calculates the quantization error of the given clustering
        :return: the quantization error
        """
        total_distance = 0.0
        s = Similarity(self.e) #Class containing different types of distance measures

        #For each point, compute squared fractional distance between point and centroid ?
        for i in range(len(self.solution.patterns)): 
            total_distance += math.pow(s.fractional_distance(self.solution.patterns[i], self.solution.centroids[self.solution.solution[i]]), 2.0)

        return total_distance / len(self.solution.patterns) # Divide total_distance by the total …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis quantization

4
推荐指数
1
解决办法
2696
查看次数

Python:分配多个嵌套列表的最短方法是什么

我有不同的嵌套列表:

a = [[] for e in range(6)]
b = [[] for e in range(6)]
c = [[] for e in range(6)]
Run Code Online (Sandbox Code Playgroud)

鉴于这些列表具有相似的结构,是否可以同时分配它们(在一行中)?我在想这样的事情:

a, b, c = [[] for e in range(6)] ...?...
Run Code Online (Sandbox Code Playgroud)

我正在使用Python 3

python nested list variable-assignment

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

使用 numpy/scipy 计算连续向量之间距离的最快方法

我有一个线增长算法,我需要:

  • 计算数组中连续向量之间的距离(欧几里德)
  • 插入距离大于特定阈值的新向量

在此输入图像描述

我通常以非常幼稚的方式执行此操作(请参阅下面的代码),并且想知道如何使用 numpy(如果需要的话还可以使用 scipy)以最快的方式计算连续向量之间的距离。

import math


threshold = 10
vectorList = [(0, 10), (4, 8), (14, 14), (16, 19), (35, 16)]

for i in xrange(len(vectorList)):
    p1 = vectorList[i]
    p2 = vectorList[i+1]
    d = math.sqrt((p2[0] - p1[0])**2 + (p2[1] - p1[1])**2)
    if d >= threshold:
        pmid = ((p1[0] + p2[0]) * .5, (p1[1] + p2[1]) * .5)
        vectorList.insert(i+1, pmid)
Run Code Online (Sandbox Code Playgroud)

编辑:我想出了以下解决方法,但我仍然关心距离计算。

我需要计算一个向量与其列表中的下一个邻居之间的距离,而不是像我在这里所做的那样计算整个距离矩阵(所有向量彼此相对)。

import numpy as np

vectorList = [(0, 10), (4, 8), (14, 14), (16, 19), (35, 16)] …
Run Code Online (Sandbox Code Playgroud)

python numpy distance insertion python-2.7

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