在 NUMPY COOK BOOK 所附代码 memmap.py 里,有如何使用 NumPy 和 Matplotlib 来生成和显示随机方块图像的代码:
import numpy as np
import matplotlib.pyplot as plt
N = 512
NSQUARES = 30
# Initialize
img = np.zeros((N, N), np.uint8)
#centers = np.random.random_integers(0, N, size=(NSQUARES, 2))
centers = np.random.randint(0, N, size=(NSQUARES, 2))
radii = np.random.randint(0, N/9, size=NSQUARES)
colors = np.random.randint(100, 255, size=NSQUARES)
# Generate squares
for i in range(NSQUARES):
xindices = range(centers[i][0] - radii[i], centers[i][0] + radii[i])
xindices = np.clip(xindices, 0, N - 1)
yindices = range(centers[i][1] - radii[i], centers[i][1] + radii[i])
yindices = np.clip(yindices, 0, N - 1)
if len(xindices) == 0 or len(yindices) == 0:
continue
coordinates = np.meshgrid(xindices, yindices)
img[coordinates] = colors[i]
# Load into memory map
img.tofile('random_squares.raw')
img_memmap = np.memmap('random_squares.raw', shape=img.shape)
# Display image
plt.imshow(img_memmap)
plt.axis('off')
plt.show()
运行以上代码,得不到方块状的图形,而是得到条状的图形,如下:
修正代码如下,则能得到方块状的图形:
import numpy as np
import matplotlib.pyplot as plt
N = 512
NSQUARES = 30
# Initialize
img = np.zeros((N, N), dtype=np.uint8)
centers = np.random.randint(0, N, size=(NSQUARES, 2))
radii = np.random.randint(0, N//9, size=NSQUARES) # Ensure integer division
colors = np.random.randint(100, 255, size=NSQUARES)
# Generate squares
for i in range(NSQUARES):
x = centers[i][0]
y = centers[i][1]
r = radii[i]
xstart = max(x - r, 0)
xend = min(x + r, N - 1)
ystart = max(y - r, 0)
yend = min(y + r, N - 1)
img[xstart:xend, ystart:yend] = colors[i]
# Load into memory map
img.tofile('random_squares10119.raw')
img_memmap = np.memmap('random_squares10119.raw', shape=img.shape)
# Display image
plt.imshow(img_memmap)
plt.axis('off')
plt.show()
得到的方块状图形:
二者不同,是 clip()和切片的原因吗