考虑一个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对,以便我可以在循环中使用它。
但我不知道怎么做!
有人可以告诉我该怎么做吗?
谢谢
答案 0 :(得分: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功能以更直接(更有效)的方式执行此操作
答案 1 :(得分: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
是您的列表,带有布尔值。