moliu 2024-06-25 17:09 采纳率: 57.1%
浏览 3

clip()和切片,是造成图形不同的原因吗

在 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()

运行以上代码,得不到方块状的图形,而是得到条状的图形,如下:

img


修正代码如下,则能得到方块状的图形:

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()

得到的方块状图形:

img


二者不同,是 clip()和切片的原因吗

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-25 17:09
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在分析这个问题之前,我们先了解一下 NumPy 的 np.clip() 函数和 Python 的切片操作。

    1. np.clip() 函数np.clip() 函数用于将数组中的元素限制在指定的范围内。如果元素的值小于下限,则将其设置为下限值;如果大于上限,则将其设置为上限值。

    2. Python 切片操作: 切片操作用于从序列(如列表、元组、字符串等)中提取一部分元素。在 NumPy 数组中,切片操作同样适用,可以提取数组的子集。

    现在我们来分析你提供的两段代码。

    原始代码问题分析:

    原始代码中使用 np.clip() 来限制 xindicesyindices 的范围,但是问题出现在 np.meshgrid() 函数的使用上。np.meshgrid() 函数生成一个坐标网格,其输入是两个一维数组,分别表示 x 和 y 轴上的坐标点。然而,np.meshgrid() 并不是用来生成矩形区域的,而是生成一个完整的二维网格,其中每个点都是由 x 轴和 y 轴上的点组合而成。这意味着,即使 xindicesyindicesnp.clip() 限制在了正确的范围内,np.meshgrid() 仍然会生成一个超出实际方块区域的网格,导致在图像上绘制时超出了方块的边界。

    修正后的代码分析:

    修正后的代码直接使用切片操作来限制 x 和 y 轴的范围,这样可以直接生成方块状的图形。切片操作 xstart:xendystart:yend 确保了只在这个范围内填充颜色,从而生成了正确的方块图形。

    关键差异分析:

    • np.clip() 与切片操作np.clip() 用于确保索引值不会超出数组的边界,但在原始代码中,它与 np.meshgrid() 结合使用时,并没有正确地限制方块的边界。而切片操作直接限制了填充颜色的范围,确保了方块的完整性。
    • np.meshgrid() 的误用:原始代码中 np.meshgrid() 的使用导致了超出方块边界的绘制,因为它生成了一个完整的二维网格,而不是一个矩形区域。

    结论:

    原始代码中的问题不是因为 np.clip() 本身,而是因为 np.clip()np.meshgrid() 结合使用时的不当。修正后的代码通过直接使用切片操作,正确地限制了方块的边界,从而生成了方块状的图形。

    关于参考链接,由于你提供的代码示例中并没有直接涉及到外部链接,因此这里不提供具体的链接。但是,你可以查阅 NumPy 和 Matplotlib 的官方文档来获取更多关于 np.clip()np.meshgrid() 以及切片操作的详细信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月25日

悬赏问题

  • ¥20 ic卡dump文件校检码解密
  • ¥15 关于:接收到的数据不是有效的JSON格式
  • ¥15 apdl语言如何增加受力分析
  • ¥15 算法对比:学校优化算法与蚁群算法对比
  • ¥15 机电一体化系统设计说明书
  • ¥20 sgy数据提取地震波速,有人能回答吗小馋
  • ¥20 c#实现打开word的功能,并且需要安装成windows服务,word打不开怎么办
  • ¥15 python用ARIMA时间预测模型预测数据出错,急!
  • ¥30 为什么后端传给前端vue的河流json数据不在地图中显示出来
  • ¥50 关于弹性波动方程求解的问题: