0

我的意思是想象我有一个空的 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]>0 行,但我不明白它有什么问题......

4

4 回答 4

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 值的网格。您可以在上面看到如何使用您的 zip 调用。

于 2013-04-09T20:05:24.723 回答
0
x = numpy.array(x)
y = numpy.array(y)
counter = ((x<=15) | (y<=15) | (x>=85) | (y>=85)).sum()
于 2013-04-09T20:36:26.800 回答
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"
于 2013-04-09T20:28:58.510 回答
0

我不完全确定我是否理解您要达到的目标,但是如果您想获取 3000 个随机点并查看其中有多少在 100x100 正方形边缘的 15 个单位内,则以下操作将起作用:

sum(not (15 < x < 85 and 15 < y < 85) for x, y in array)

这利用了 Python 的布尔值TrueFalse整数值(分别为 1 和 0)这一事实。True因此,您可以对s 和s的序列求和,False以获得真实值的计数。

我使用了一个否定表达式,因为它允许我使用 Python 的不等式链接来进行实际的边界测试。这个表达not 15 < x < 85对我来说似乎比同等的要好得多x <= 15 or x >= 85。这可能是主观的,您的里程可能会有所不同。

于 2013-04-09T20:33:56.047 回答