【问题标题】:Creating a 2D array with random numbers WITHOUT NUMPY (Python)使用没有 NUMPY 的随机数创建二维数组(Python)
【发布时间】:2019-10-29 10:01:20
【问题描述】:

如何在不使用 NumPy (Python) 的情况下创建具有随机数的二维数组

【问题讨论】:

    标签: python arrays random numbers


    【解决方案1】:

    您可以使用random 模块并使用列表理解填充嵌套列表

    import random
    
    low = 0
    high = 10
    cols = 10
    rows = 5
    
    [random.choices(range(low,high), k=cols) for _ in range(rows)]
    
    [[5, 7, 1, 0, 6, 5, 9, 2, 5, 6],
     [9, 2, 3, 0, 6, 7, 0, 6, 6, 3],
     [2, 7, 9, 2, 4, 5, 5, 9, 9, 4],
     [2, 6, 7, 8, 5, 1, 4, 4, 4, 4],
     [9, 2, 8, 4, 5, 2, 0, 1, 2, 1]]
    

    对于嵌套的浮点列表,您可以将每个 range 映射到 float

    choices = list(map(float, range(low,high)))
    [random.choices(choices , k=cols) for _ in range(rows)]
    
    [[0.0, 3.0, 9.0, 1.0, 5.0, 3.0, 7.0, 4.0, 2.0, 4.0],
     [5.0, 8.0, 7.0, 7.0, 7.0, 2.0, 9.0, 8.0, 2.0, 6.0],
     [3.0, 3.0, 1.0, 9.0, 2.0, 8.0, 7.0, 2.0, 9.0, 7.0],
     [7.0, 8.0, 1.0, 2.0, 0.0, 6.0, 7.0, 6.0, 0.0, 9.0],
     [3.0, 3.0, 3.0, 1.0, 7.0, 8.0, 3.0, 9.0, 2.0, 8.0]]
    

    【讨论】:

    • 哇,谢谢,完美!我也可以使用浮点数而不是整数吗?
    • 你太棒了!但这也能生成小数点后的随机数字吗?在您的代码中,它将始终为 00
    • 在这种情况下[[random.random() for i in range(cols)] for _ in range(rows)]@tjardskleener
    • 我可以扩大这个范围吗?从0到1
    【解决方案2】:
    [[random.random() for _ in range(3)] for _ in range(7)]
    

    这会生成一个大小为[7, 3]random float in [0, 1) interval 的二维数组。

    您使用嵌套列表推导。外层构建一个主列表,而内层构建用作主列表元素的列表。


    编辑

    然后您可以根据需要对其进行调整。例如:

    import random
    import pprint
    
    NUM_ROWS=7
    NUM_COLS=3
    MAX_VAL=1000.50
    MIN_VAL=-MAX_VAL
    
    pprint.pprint([
      [random.uniform(MIN_VAL, MAX_VAL) for _ in NUM_COLS]
      for _ in NUM_ROWS
    ])
    

    这会打印一个包含 7 行和 3 个列的列表/数组/矩阵,并在 [-1000.50, 1000.50) 间隔内随机浮动:

    [[561.3985362160208, -157.9871329592354, -245.7102502320838],
     [-817.8786101352823, -528.9769041860632, 102.67728824479877],
     [-886.6488625065194, 941.0504221837489, -458.58155555154565],
     [6.69525238666165, 919.5903586746183, 66.70453038938808],
     [754.3718741592056, -121.25678519054622, -577.7163532922043],
     [-352.3158889341157, 254.9985130814921, -365.0937338693691],
     [563.0633042715097, 833.2963094260072, -946.6729221921638]]
    

    可以使用array[line][column] 对结果数组进行索引。

    【讨论】:

    • 谢谢!!我也可以使用浮点数而不是 -1000.50 到 1000.50 范围内的整数吗?
    • @tjardskleener 是的,这很容易使用uniform 而不是random[[random.uniform(-1000.50, 1000.50) for _ in range(3)] for _ in range(7)]
    • random.random() 为您提供[0,1) 之间的数字,因此要获取[-1000.50,1000.50) 之间的值,您需要像这样修改返回值:random.random() * 2001.0 - 1000.5 或使用random.uniform,如前所述@AlexisBRENON。
    • @GáborFekete random.uniform 方法在内部执行此操作,但提高了清晰度。
    • 你们疯了!非常感谢您的帮助!!
    【解决方案3】:
    import pandas as pd
    from random import randint
    
    outside_size = 10 # How many nested lists to include
    inside_size = 10  # How many numbers will be in an inside list
    outside_list = [] # The final list
    for i in range(0, outside_size, 1):
        _list = [] # Create new "inside" (nested) list
        for j in range(0, inside_size, 1): # Populate the nested list with random numbers
            _list.append(randint(0, 100))
        outside_list.append(_list) # Add the inside (nested) list to the outside (final) list
    
    df = pd.DataFrame(outside_list) # Create the dataframe from it
    print(df)
    

    输出:

    0   1    2   3   4   5   6   7   8   9
    0  63  79  100  42  98  45  80  85  71  98
    1  65  38   55   5  49  19  99  87  36  74
    2  49  76   71  56  54  30  90  50  96  26
    3  31  46   79  38  13  66  10  31   8  59
    4   0  98    7  67  87   7  95  79  94  50
    5  79  44   86  83   1  79  15  80  31  79
    6  86   5   19  78  78  87  77   8  43  90
    7  30  59    4   4  68  85  95  34  92  48
    8  65  39   28  76  12  59  28  29  15  56
    9  34  22   68  57  97  69  59  62  12  29
    

    为了代码的速度和简洁性,您可以使用嵌套列表推导式来获得相同的效果...

    outside_list = [[randint(0, 100) for j in range(0, inside_size)] for i in range(0, outside_size) ]
    df = pd.DataFrame(outside_list)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 2014-07-29
      • 2018-04-17
      • 2018-08-22
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多