我正在绘制一个1,000 x 1,000的网格,其中白色正方形表示非质数,黑色正方形表示质数。
它应该看起来像一个显示数字0-1,000,000的大网格,并将质数所在的任何正方形涂黑(因此在第一个和第二个正方形上它是白色的(0和1),第三个和第四个正方形是黑色的(2和3),依此类推)。一直到100万
到目前为止我的代码如下:
导入
from math import sqrt, ceil
import matplotlib.pyplot as plt
from matplotlib import colors
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.
'''
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:图像数据无法转换为浮点型
data = (x, y)
我需要如何将x和y的列表转换成我需要的(而不是随机生成的数字)?
发布于 2018-12-06 07:08:30
我猜我们的想法是创建一个0数组(表示“不是质数”的值),并将其中的值设置为1,其中您有一个质数。然后,您需要将数组重塑为NxN网格。
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)
发布于 2018-12-06 06:22:07
对于引物数的生成,您可以使用eulerlib:https://pypi.org/project/eulerlib/,这个库在处理质数时非常有用。
https://stackoverflow.com/questions/53641523
复制相似问题