2

考虑一个 100X100 阵列。

i) 在这样的数组中生成一个包含数千个随机位置的数组,例如 (3,75) 和 (56, 34)。

ii) 计算您的一个随机位置在任何(直)边缘的 15 像素范围内的频率。

我正在尝试做上述问题以帮助我学习编程语言 Python,我是编程新手。

这是我到目前为止所得到的:

from __future__ import division
from pylab import *
import math as m
from numpy import *
from random import randrange

N = 3000
coords_array = array([randrange(100) for _ in range(2 * N)]).reshape(N, 2)

这将创建 N 个随机位置的数组,并且不,我正在尝试创建一个循环,如果 x>85 或 y>85 或 x<15 或 y<15,则将 1 附加到空列表,然后将零附加到如果 x 或 y 是其他任何东西,则相同的空列表。然后我会找到列表的总和,这将是我对有多少随机位置落在边缘内的计数。

这是我想做的事情:

coordinate=coords_array[x,y]
b=[]
def location(x,y):
    if x>85 or y>85:
        b.appnend(1)
    if x<15 or y<15:
        b.append(1)
    else:
        b.append(0)


print b
print x

但我无法将数组分配为 x 和 y 变量。我希望能够将随机坐标集的每一行分配为 x,y 对,以便我可以在循环中使用它。

但我不知道该怎么做!

请问有人可以告诉我怎么做吗?

谢谢

4

2 回答 2

1

好的,这个问题的答案:

但我无法将数组分配为 x 和 y 变量。我希望能够将随机坐标集的每一行分配为 x,y 对,以便我可以在循环中使用它

会是这样的:

for pair in coords_array:
    # Do something with the pair

NumPy 数组通过for迭代其主轴表现为常规 Python 序列,这意味着pair将包含(在您的情况下)两个元素的数组:x 和 y。你也可以这样做:

for x, y in coords_array:
    # Do something with the pair

注意:我想你想写这样的函数:

def location(x,y):
    if x>85 or y>85:
        b.append(1)
    elif x<15 or y<15:
        b.append(1)
    else:
        b.append(0)

或者

def location(x,y):
    if x>85 or y>85 or x<15 or y<15:
        b.append(1)
    else:
        b.append(0)

甚至

def location(x,y):
    if not (15 <= x <= 85) or not (15 <= y <= 85):
        b.append(1)
    else:
        b.append(0)

否则,正如@TokenMacGuy 指出的那样,在某些情况下您将插入两个值。

注意:根据您的问题,我了解到您想专门编写此代码来学习 Python,但是您可以通过仅使用 NumPy 功能以更直接(和有效)的方式做到这一点

于 2013-04-10T12:28:36.820 回答
1

您可以让 numpy 为您执行循环:

n = 3000
coords = np.random.randint(100, size=(n, 2))
x, y = coords.T
is_close_to_edge = (x < 15) | (x >= 85) | (y < 15) | (y >= 85)
count_close_to_edge = np.sum(is_close_to_edge)

请注意,100 个元素数组的第一个索引是 0,最后一个索引是 99,因此边缘 15 个位置内的项目是 0...14 和 85...99,因此>=在比较中。在上面的代码中,is_close_to_edge是您的列表,带有布尔值。

于 2013-04-10T13:16:41.080 回答