我想要想象我有一个空的100 * 100数组,并且在这个数组中有几千个随机位置/坐标。我需要计算这些坐标中有多少位于“直”边缘的15个像素内。到目前为止,我有这个代码...
import random
import pylab
import numpy #all import statements
pylab.close("all")
x = [(random.randint(0,100)) for i in range(3000)] #creating list of x coordinates
y = [(random.randint(0,100)) for j in range(3000)] #creating list of y coordinates
array=zip(x,y) #creating an array by combining the x and y coordinates
#end of part 1a
counter = 0 #start of 1b
for i in range(100):
for j in range(100):
if i<=15 or i>=85:
if array[i][j]>0:
counter=counter+1
elif j<=15 or j>=85:
if array[i][j]>0:
counter=counter+1
print counter,"random locations within 15 pixels of the edges"
我如何更正代码?目前我得到一个错误的读数,说“元组索引超出范围”我知道它对if array [i] [j]&gt; 0行的影响,但我不明白它的错误...
答案 0 :(得分:0)
你很亲密。您正在生成稀疏的值网格。如果通过首先将它们放在字典中来迭代这些元组,您可以检查每个离散位置是否存在边缘违规。以下是一个工作示例。
edge_dist = 15
sparse_grid = collections.defaultdict(int)
for x,y in zip(x,y):
sparse_grid[(x,y)] += 1
for i,j in sparse_grid:
if (i <= edge_dist or i >= 100-edge_dist or
j <= edge_dist or j >= 100-edge_dist):
counter += sparse_grid[(i,j)]
print "%d random locations within 15 pixels of the edges" % counter
# 1579 random locations within 15 pixels of the edges
您在版本中遇到的错误来自于zip为您提供x,y元组而不是x-by-y值网格的事实。您可以在上面看到如何使用您的拉链调用。
答案 1 :(得分:0)
您无需实际构建数组来计算所覆盖的边缘点。如果您担心不计算两次相同的坐标,则只需删除带有一组的重复项。
cords = set(array) # set removes duplicates
counter = 0
for i, j in cords: # or array if you want to count duplicates
if i <= 15 or i >= 85 or j <= 15 or j >= 85:
counter += 1
print counter, "random locations within 15 pixels of the edges"
答案 2 :(得分:0)
我不完全确定我理解你想要达到的目标,但是如果你想要获取3000个随机点并看看它们中有多少是在100x100平方的边缘的15个单位内,以下将工作:
sum(not (15 < x < 85 and 15 < y < 85) for x, y in array)
这利用了Python的布尔值True
和False
也具有整数值(分别为1和0)的事实。因此,您可以总结一系列True
s和False
s来计算真实值。
我使用了一个否定的表达式,因为它允许我使用Python的不等式链接进行实际的边界测试。表达式not 15 < x < 85
似乎比同等x <= 15 or x >= 85
更好。这可能是主观的,您的里程可能会有所不同。
答案 3 :(得分:0)
x = numpy.array(x)
y = numpy.array(y)
counter = ((x<=15) | (y<=15) | (x>=85) | (y>=85)).sum()