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 倍以上,我们应该承认这一点。
您还可以使用广播或等效的方式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)