用圆内的 1 填充 numpy 数组,其他地方用 0 填充 numpy 数组

six*_*ees 1 geometry numpy python-3.x

我试图模仿一个用 1 填充的圆圈,以及用数组中的 0 填充数组的其余部分numpy。这与图形与圆重叠的数值计算有关。现在我最多可以按元素进行(这很慢):

import numpy as np
from my_magic_constants import center, radius

c1 = np.zeros((center*2, center*2))
for h in range(center*2):
    for w in range(center*2):
        if (center-h)**2 + (center-w)**2 < radius**2:
            c1[h,w] = 1
Run Code Online (Sandbox Code Playgroud)

在 numpy 数组中初始化圆的更有效方法是什么?


更新

我只检查了最早答案的加速度。如果有人想对时间进行基准测试,这里是代码

import numpy as np
from time import time

eps = 1e-10
center = 8119
square_half_size = 5741
square = np.zeros((center*2, center*2))
square[center-square_half_size:center+square_half_size, center-square_half_size:center+square_half_size] = 1


def iou(c):
    overlap = c * square
    union = (c + square).clip(0,1)
    return np.sum(overlap)/(np.sum(union) + eps)


best_iou = 0

for radius in range(center - int(square_half_size * 1.093), center):
    t1 = time()
    c1 = np.zeros((center*2, center*2))
    for h in range(center*2):
        for w in range(center*2):
            if (center-h)**2 + (center-w)**2 < radius**2:
                c1[h,w] = 1

    current_iou = iou(c1)
    if current_iou > best_iou:
        best_iou = current_iou
        # print(i, best_iou)
    t = time() - t1

    print(t)
    break
Run Code Online (Sandbox Code Playgroud)

如果后来的答案快了 10 倍以上,我们应该承认这一点。

Chr*_*axs 5

您还可以使用广播或等效的方式np.add.outer

import numpy as np
center, radius = 10, 5

arr = np.arange(-center, center) ** 2
out = np.add.outer(arr, arr) < radius ** 2
# or: arr[:, None] + arr[None, :] < radius ** 2

# Optionally convert dtype if you don't like bool:
out = out.astype(float)
Run Code Online (Sandbox Code Playgroud)

  • 好的。这两个都非常快。 (2认同)