首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于质数创建网格

基于质数创建网格
EN

Stack Overflow用户
提问于 2018-12-06 06:10:30
回答 2查看 512关注 0票数 1

我正在绘制一个1,000 x 1,000的网格,其中白色正方形表示非质数,黑色正方形表示质数。

它应该看起来像一个显示数字0-1,000,000的大网格,并将质数所在的任何正方形涂黑(因此在第一个和第二个正方形上它是白色的(0和1),第三个和第四个正方形是黑色的(2和3),依此类推)。一直到100万

到目前为止我的代码如下:

导入

代码语言:javascript
复制
from math import sqrt, ceil
import matplotlib.pyplot as plt
from matplotlib import colors
import numpy as np

素数的生成列表

代码语言:javascript
复制
def all_prime(n):
    # https://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/3035188#3035188
    """ Returns  a list of primes < n """
    sieve = [True] * n
    for i in range(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
    return [2] + [i for i in range(3,n,2) if sieve[i]]

实际绘图

代码语言:javascript
复制
def prime_plot(n):
    '''
    Takes on argument (n), which is a number > 2 and produces a list of all primes up to n.
    Will then show on a plot the primes vs all numbers in range n.
    '''

    x = all_prime(n)
    y = list(range(n))

    data = np.random.rand(10, 10) * 20

    cmap = colors.ListedColormap(['white', 'black'])
    bounds = [0,10,20]
    norm = colors.BoundaryNorm(bounds, cmap.N)

    fig, ax = plt.subplots()
    ax.imshow(data, cmap=cmap, norm=norm)

    # draw gridlines
    ax.grid(which='major', axis='both', linestyle='-', color='k', linewidth=2)
    ax.set_xticks(np.arange(0, 10, 1));
    ax.set_yticks(np.arange(0, 10, 1));

    plt.show()

prime_plot(100)  

虽然我的目的是生成一个大小为m x m的网格(其中m是sqrt(len(N),但我想从创建一个静态大小的网格开始。

我如何修改上面的代码来创建我想要的。使用matplotlib时,大网格看起来真的很乱。

当更改数据以使用列表时,I TypeError:图像数据无法转换为浮点型

代码语言:javascript
复制
data = (x, y)

我需要如何将x和y的列表转换成我需要的(而不是随机生成的数字)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-06 07:08:30

我猜我们的想法是创建一个0数组(表示“不是质数”的值),并将其中的值设置为1,其中您有一个质数。然后,您需要将数组重塑为NxN网格。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

def all_prime(n):
    # https://stackoverflow.com/questions/2068372/fastest-way-to-list-all-
    #primes-below-n-in-python/3035188#3035188
    """ Returns  a list of primes < n """
    sieve = [True] * n
    for i in range(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
    return [2] + [i for i in range(3,n,2) if sieve[i]]

def prime_plot(n):
    '''
    Takes on argument (n), which is a number > 2 and produces a list of all primes up to n.
    Will then show on a plot the primes vs all numbers in range n.
    '''
    N = int(np.sqrt(n))
    if N*N != n:
        raise ValueError("Need a square grid.")

    primes = np.array(all_prime(n)).astype(int)
    data = np.zeros(n)
    data[primes] = 1
    data = data.reshape(N,N)

    fig, ax = plt.subplots()
    ax.imshow(data, cmap="gray_r")

    for p in primes:
        ax.text(p%N, p//N, p, color="w", ha="center", va="center")

    plt.show()

prime_plot(100)

票数 2
EN

Stack Overflow用户

发布于 2018-12-06 06:22:07

对于引物数的生成,您可以使用eulerlib:https://pypi.org/project/eulerlib/,这个库在处理质数时非常有用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53641523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档