基本的Python编程需要涉及数组和随机位置

时间:2013-04-09 13:18:42

标签: python multidimensional-array

考虑一个100X100阵列。

  1. 生成一个包含数千个随机位置的数组 这样的阵列,例如, (3,75)和(56,34)。
  2. 计算一个随机位置的频率在15以内 任何(直)边的像素
  3. 我正在尝试做上述问题,以帮助我学习编程语言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&gt; 85或xcoordinate&lt; 15或ycoordinate&gt; 85或ycoordinate&lt; 15然后将数字附加到空列表,然后使用列表的长度作为计数器?

    有人可以就这个问题给我一些指导吗? 我是以正确的方式做到的吗?如果是这样我怎么不?如果是这样,我该如何继续?

    。 。 。 感谢大家的帮助。

    我现在已经设法完成这两个部分,但现在我已经被要求做这个作为前一部分的扩展:

    iii)计算一个随机位置落入(左右)15个像素的频率 半径为50像素的圆,并将结果写入屏幕,例如一般 阵列中N%的位置落在该区域中[N是0之间的数字 注意角落中的坐标在圆圈的15个像素内,然后是它们 应该包括在内(如果它们超过15像素,那么他们不应该 定)。

    iv)添加从用户请求阵列中的位置的代码,然后发出警报 如果该位置落在该区域,例如警告:您选择的位置会下降 靠近圆圈的边缘。

    我怎么会这样呢?我甚至不知道从哪里开始。 请问有人给我一些指示吗? 感谢

1 个答案:

答案 0 :(得分: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| - 35x = 0..14的函数x = 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,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之间的数字。

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

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

  4. 方括号之间的东西称为 list comprehension 。它在语义上等同于:


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