【问题标题】:Basic Python programming help needed involving arrays and random locations需要涉及数组和随机位置的基本 Python 编程帮助
【发布时间】:2013-04-09 23:26:04
【问题描述】:

考虑一个 100X100 的数组。

  1. 生成包含数千个随机位置的数组 这样的数组,例如(3,75) 和 (56, 34)。
  2. 计算随机位置之一落在 15 以内的频率 任何(直)边的像素

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

这是我目前所拥有的:

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

array1=[]
nMax=1001
n=1
while n<nMax:
    array1.append(random.randint(1, 101))
    n=n+1
array1=array(array1)
array1=array1.reshape(1000,1)
print array1

array2=[]
nMax=1001
n=1
while n<nMax:
    array2.append(random.randint(1, 101))
    n=n+1
array2=array(array2)
array2=array2.reshape(1000,1)
print array2

这会生成两个包含 1000 个随机整数的单列数组。一个数组是我的随机 x 坐标集,另一个数组是我的随机 y 坐标集。 我正在尝试合并这两个数组,以便我有一个 x 和 y 坐标数组,我该怎么做?一旦我有一个随机 x 和 y 坐标数组,我就可以使用 if、else 语句来完成问题吗?例如如果 xcoordinate>85 或 xcoordinate85 或 ycoordinate

请问有人可以就这个问题给我一些指导吗? 我做对了吗?如果是这样,我怎么不是?如果是这样,我该如何继续?

。 . . 感谢大家的帮助。

我现在已经设法完成了这两个部分,但现在我面临着将这作为对前一个部分的扩展的挑战:

iii) 计算您的一个随机位置在(任一侧)15 像素范围内的频率 一个半径为 50 像素的圆,并将结果写入屏幕,例如一般 数组中 N% 的位置位于该区域 [N 是介于 0 之间的数字 和 100] 请注意,角落中的坐标在圆的 15 个像素内,然后它们 应该包含在其中(如果它们距离超过 15 像素,那么它们不应该 是)。

iv) 添加代码,向用户请求数组中的位置,然后发出警报 如果该位置属于该区域,例如警告:您选择的位置下降 靠近圆的边缘。

我会怎么做呢?我什至不知道从哪里开始。 有人可以给我一些指示吗? 谢谢

【问题讨论】:

  • 你想从 np.random.randint(0, w, size=1000) 之类的东西构建

标签: python multidimensional-array


【解决方案1】:

可以跳过实际生成数组,直接进行频率计算:

首先需要注意的是,由于x和y坐标都是完全随机的:

我们有规则:

P(A or B) = P(A) + P(B) - P(A and B)

所以我们可以这么说

P(X or Y within 15) = P(X within 15) + P(Y within 15) - P(X and Y within 15)

由于暗示 X 和 Y 是来自0 to 99(或来自1 to 100)的均匀随机,我们可以假设

P(X within 15) = P(Y within 15)

所以整个事情变成了

P(X or Y within 15) = 2P(X within 15) - P(X within 15)^2

现在,我们只需要计算P(X within 15)。观察到 X 只能取整数值,因此函数 f(x) = |X - 49.5| - 35 将大于零对于 x = 0..14x = 85..99。 (我们从零开始索引,但这相当于从 1...100 开始)。

所以,代码:

from random import randrange

N = 3000
P_x_within_15 = sum(abs(randrange(100) - 49.5) - 35 > 0 for _ in range(N)) / float(N)

print "Frequency of X or Y within 15 pixels of edge:",
print 2 * P_x_within_15 - P_x_within_15 ** 2

您可能已经注意到,我们跳过了实际创建数组,只是将随机数生成时的布尔值 (True/False with True = 1, False = 0) 结果相加。

编辑 - 实际创建一个数组

为 100 x 100 矩阵创建一个随机坐标数组:

使用numpy 代码将是:

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

使用纯python,会是:

from random import randrange
N = 3000
coords_list = [(randrange(100), randrange(100)) for _ in range(N)]

这里有几点需要注意:

  1. 在 python 中,索引从零开始排序。 randrange(100) 会给你一个介于 0 到 99 之间的数字,包括 0 到 99。

  2. N 只是我们希望生成的坐标数

  3. 术语点:在python中,方括号表示的数据结构是lists,而不是数组(尽管它们等价于其他编程语言中的数组)。在上面的代码中array1 是python list,而不是array(这是一种不同的数据结构)。对位:numpy 然而,广泛使用数组。在您的代码中,当您执行array(array1) 时,实际上是在创建一个numpy 数组。

  4. 方括号之间的内容称为列表理解。它在语义上等价于:


coords_list = []
for _ in range(N):
    coords_list.append((randrange(100), randrange(100)))

【讨论】:

  • 绝妙的方法谢谢你,这对我将来肯定会有所帮助。但是现在我被告知要使用实际创建数组的方法。你能告诉我如何使用实际创建数组的方法吗?你似乎知道你在做什么。再次感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2015-01-25
  • 2014-11-30
  • 1970-01-01
相关资源
最近更新 更多