Python 如何在没有numpy的情况下生成随机矩阵

Python 如何在没有numpy的情况下生成随机矩阵,python,matrix,random,Python,Matrix,Random,我遇到了这个问题:创建一个没有numpy的随机矩阵 我搜索了一下这个词,但没有找到。每次我搜索一个随机数时,你都必须重新设定种子吗?我的解决办法是: import random def matrix_random_number(n_filas, n_columnas, num_decimals=2): blank = [0] row = blank*n_filas array = [row]*n_columnas for j in range(n_co

我遇到了这个问题:创建一个没有numpy的随机矩阵

我搜索了一下这个词,但没有找到。每次我搜索一个随机数时,你都必须重新设定种子吗?我的解决办法是:

import random

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    blank = [0]
    row = blank*n_filas
    array = [row]*n_columnas
    
    for j in range(n_columnas):
        for i in range(n_filas):
            array[j][i] = random.randint(0,100*10**num_decimals)/10**num_decimals
    return array
但我的产出是:

[[80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97],
 [80.91, 47.46, 15.86, 77.16, 92.47, 54.92, 2.76, 97.42, 14.99, 15.97]]

所以这显然不是随机的。如何改进?为什么这是坏代码?提前感谢

您使用了
array=[row]*n_columns
。这使得该
数组中的每个术语都是相同的对象,
。因此,行中的所有项目都是相同的。您可以创建一个空的
数组
,每次都添加一个
列表
对象。例如:

import random

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = []
    
    for j in range(n_columnas):
        array.append([])  # Add a list to the array
        for i in range(n_filas):
            array[j].append(random.randint(0,100*10**num_decimals)/10**num_decimals)  # Add number to row
    return array

将给出您想要的答案。

您使用的
array=[row]*n\u columns
。这使得该
数组中的每个术语都是相同的对象,
。因此,行中的所有项目都是相同的。您可以创建一个空的
数组
,每次都添加一个
列表
对象。例如:

import random

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = []
    
    for j in range(n_columnas):
        array.append([])  # Add a list to the array
        for i in range(n_filas):
            array[j].append(random.randint(0,100*10**num_decimals)/10**num_decimals)  # Add number to row
    return array

将给出您想要的答案。

该问题与设置随机数生成器种子无关,因为您正在创建一个矩阵,该矩阵引用了相同的行列表
n\u列。
通过使用初始创建空矩阵,可以轻松解决此问题:

from pprint import pprint
import random


def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = [[0 for _ in range(n_filas)] for _ in range(n_columnas)]

    for j in range(n_columnas):
        for i in range(n_filas):
            array[j][i] = random.randint(0,100*10**num_decimals)/10**num_decimals
    return array

array = matrix_random_number(7, 10)
pprint(array)
样本输出:

[[12.88, 47.27, 95.93, 60.3, 1.49, 6.75, 90.73],
 [6.87, 53.84, 78.22, 69.36, 62.34, 5.5, 66.63],
 [10.29, 42.7, 55.67, 25.68, 39.48, 91.17, 3.96],
 [59.77, 88.4, 52.77, 84.35, 21.0, 69.19, 35.0],
 [85.63, 10.75, 29.8, 67.25, 0.12, 58.79, 42.46],
 [34.87, 45.07, 25.64, 4.74, 71.25, 31.57, 83.94],
 [32.61, 41.17, 98.27, 88.85, 30.23, 62.89, 84.26],
 [82.04, 17.88, 75.25, 56.83, 51.69, 91.16, 32.7],
 [66.66, 56.21, 39.0, 6.27, 87.61, 70.42, 56.06],
 [49.68, 22.95, 78.53, 98.12, 74.47, 18.45, 94.32]]
[[59.742, 5.339, 91.339, 20.221, 81.702, 45.815, 23.141],
 [32.716, 29.27, 89.193, 4.021, 79.846, 93.345, 61.367],
 [47.356, 33.87, 40.541, 68.483, 45.646, 64.898, 89.818],
 [84.371, 12.451, 76.413, 23.809, 0.591, 77.24, 12.813],
 [9.277, 31.923, 2.892, 68.653, 14.253, 14.225, 70.227],
 [91.887, 79.071, 13.206, 45.259, 73.019, 24.426, 82.332],
 [96.539, 6.743, 38.21, 55.292, 11.639, 56.902, 46.614],
 [36.961, 58.359, 79.174, 1.52, 38.937, 93.708, 25.964],
 [47.933, 62.434, 80.944, 54.694, 31.286, 84.219, 7.059],
 [82.522, 3.77, 85.51, 11.485, 83.059, 89.95, 38.618]]

问题与随机数生成器的种子设定无关,因为您正在创建一个矩阵,该矩阵引用了相同的行列表
n\u columnas
次。 通过使用初始创建空矩阵,可以轻松解决此问题:

from pprint import pprint
import random


def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = [[0 for _ in range(n_filas)] for _ in range(n_columnas)]

    for j in range(n_columnas):
        for i in range(n_filas):
            array[j][i] = random.randint(0,100*10**num_decimals)/10**num_decimals
    return array

array = matrix_random_number(7, 10)
pprint(array)
样本输出:

[[12.88, 47.27, 95.93, 60.3, 1.49, 6.75, 90.73],
 [6.87, 53.84, 78.22, 69.36, 62.34, 5.5, 66.63],
 [10.29, 42.7, 55.67, 25.68, 39.48, 91.17, 3.96],
 [59.77, 88.4, 52.77, 84.35, 21.0, 69.19, 35.0],
 [85.63, 10.75, 29.8, 67.25, 0.12, 58.79, 42.46],
 [34.87, 45.07, 25.64, 4.74, 71.25, 31.57, 83.94],
 [32.61, 41.17, 98.27, 88.85, 30.23, 62.89, 84.26],
 [82.04, 17.88, 75.25, 56.83, 51.69, 91.16, 32.7],
 [66.66, 56.21, 39.0, 6.27, 87.61, 70.42, 56.06],
 [49.68, 22.95, 78.53, 98.12, 74.47, 18.45, 94.32]]
[[59.742, 5.339, 91.339, 20.221, 81.702, 45.815, 23.141],
 [32.716, 29.27, 89.193, 4.021, 79.846, 93.345, 61.367],
 [47.356, 33.87, 40.541, 68.483, 45.646, 64.898, 89.818],
 [84.371, 12.451, 76.413, 23.809, 0.591, 77.24, 12.813],
 [9.277, 31.923, 2.892, 68.653, 14.253, 14.225, 70.227],
 [91.887, 79.071, 13.206, 45.259, 73.019, 24.426, 82.332],
 [96.539, 6.743, 38.21, 55.292, 11.639, 56.902, 46.614],
 [36.961, 58.359, 79.174, 1.52, 38.937, 93.708, 25.964],
 [47.933, 62.434, 80.944, 54.694, 31.286, 84.219, 7.059],
 [82.522, 3.77, 85.51, 11.485, 83.059, 89.95, 38.618]]

我对你的代码做了一些修改,现在它可以工作了,在我看来,这是一个非常简单的解决方案,不会对你的代码有太大的改变

import random

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = []

    for j in range(n_columnas):
        array.append([])
        for _ in range(n_filas):
            array[j].append(random.randint(0,100*10**num_decimals)/10**num_decimals)
    return array

print(matrix_random_number(7,10))
输出:

[[59.68, 73.58, 36.42, 67.03, 44.81, 44.43, 80.57], 
[26.0, 29.65, 23.18, 30.5, 9.19,35.47, 74.88],
[96.48, 29.79, 83.88, 2.54, 61.0, 6.93, 4.02],
[16.81, 88.3, 90.25, 93.95, 86.14, 55.68, 77.68],
[34.88, 87.94, 88.0, 15.74, 31.41, 68.25, 81.91],
[91.7, 2.09, 35.24, 71.55, 67.84, 65.35, 98.99],
[85.21, 65.26, 17.36, 44.8, 57.91, 67.54, 35.84],
[34.71, 19.63, 19.0, 57.81, 51.68, 98.75, 28.89],
[5.72, 42.76, 10.39, 18.22, 78.95, 73.45, 43.45],
[50.77, 15.71, 81.22, 64.02, 24.93, 71.04, 48.53]]

我对你的代码做了一些修改,现在它可以工作了,在我看来,这是一个非常简单的解决方案,不会对你的代码有太大的改变

import random

def matrix_random_number(n_filas, n_columnas, num_decimals=2):
    array = []

    for j in range(n_columnas):
        array.append([])
        for _ in range(n_filas):
            array[j].append(random.randint(0,100*10**num_decimals)/10**num_decimals)
    return array

print(matrix_random_number(7,10))
输出:

[[59.68, 73.58, 36.42, 67.03, 44.81, 44.43, 80.57], 
[26.0, 29.65, 23.18, 30.5, 9.19,35.47, 74.88],
[96.48, 29.79, 83.88, 2.54, 61.0, 6.93, 4.02],
[16.81, 88.3, 90.25, 93.95, 86.14, 55.68, 77.68],
[34.88, 87.94, 88.0, 15.74, 31.41, 68.25, 81.91],
[91.7, 2.09, 35.24, 71.55, 67.84, 65.35, 98.99],
[85.21, 65.26, 17.36, 44.8, 57.91, 67.54, 35.84],
[34.71, 19.63, 19.0, 57.81, 51.68, 98.75, 28.89],
[5.72, 42.76, 10.39, 18.22, 78.95, 73.45, 43.45],
[50.77, 15.71, 81.22, 64.02, 24.93, 71.04, 48.53]]

正如其他人所指出的,您的问题是制作同一行对象的
n
副本。我建议用嵌套列表来解决这个问题。这样就不需要临时变量、生成矩阵的多次传递或追加。这可能是一个1行,但这将是一个非常长的行,因此我为随机数生成创建了一个lambda,并将其分为两行:

从pprint导入pprint
从随机导入randint
定义矩阵随机数(n filas,n columns,num decimals=2):
gen_值=λ小数:随机整数(0100*10**小数)/10**小数
返回[gen_value(num_decimals)for _inrange(n_filas)]for _inrange(n_columns)]
pprint(矩阵随机数(7,10,3))
样本输出:

[[12.88, 47.27, 95.93, 60.3, 1.49, 6.75, 90.73],
 [6.87, 53.84, 78.22, 69.36, 62.34, 5.5, 66.63],
 [10.29, 42.7, 55.67, 25.68, 39.48, 91.17, 3.96],
 [59.77, 88.4, 52.77, 84.35, 21.0, 69.19, 35.0],
 [85.63, 10.75, 29.8, 67.25, 0.12, 58.79, 42.46],
 [34.87, 45.07, 25.64, 4.74, 71.25, 31.57, 83.94],
 [32.61, 41.17, 98.27, 88.85, 30.23, 62.89, 84.26],
 [82.04, 17.88, 75.25, 56.83, 51.69, 91.16, 32.7],
 [66.66, 56.21, 39.0, 6.27, 87.61, 70.42, 56.06],
 [49.68, 22.95, 78.53, 98.12, 74.47, 18.45, 94.32]]
[[59.742, 5.339, 91.339, 20.221, 81.702, 45.815, 23.141],
 [32.716, 29.27, 89.193, 4.021, 79.846, 93.345, 61.367],
 [47.356, 33.87, 40.541, 68.483, 45.646, 64.898, 89.818],
 [84.371, 12.451, 76.413, 23.809, 0.591, 77.24, 12.813],
 [9.277, 31.923, 2.892, 68.653, 14.253, 14.225, 70.227],
 [91.887, 79.071, 13.206, 45.259, 73.019, 24.426, 82.332],
 [96.539, 6.743, 38.21, 55.292, 11.639, 56.902, 46.614],
 [36.961, 58.359, 79.174, 1.52, 38.937, 93.708, 25.964],
 [47.933, 62.434, 80.944, 54.694, 31.286, 84.219, 7.059],
 [82.522, 3.77, 85.51, 11.485, 83.059, 89.95, 38.618]]

没有必要重新设定种子,事实上这样做会适得其反。

正如其他人所指出的,您的问题是制作同一行对象的
n
副本。我建议用嵌套列表来解决这个问题。这样就不需要临时变量、生成矩阵的多次传递或追加。这可能是一个1行,但这将是一个非常长的行,因此我为随机数生成创建了一个lambda,并将其分为两行:

从pprint导入pprint
从随机导入randint
定义矩阵随机数(n filas,n columns,num decimals=2):
gen_值=λ小数:随机整数(0100*10**小数)/10**小数
返回[gen_value(num_decimals)for _inrange(n_filas)]for _inrange(n_columns)]
pprint(矩阵随机数(7,10,3))
样本输出:

[[12.88, 47.27, 95.93, 60.3, 1.49, 6.75, 90.73],
 [6.87, 53.84, 78.22, 69.36, 62.34, 5.5, 66.63],
 [10.29, 42.7, 55.67, 25.68, 39.48, 91.17, 3.96],
 [59.77, 88.4, 52.77, 84.35, 21.0, 69.19, 35.0],
 [85.63, 10.75, 29.8, 67.25, 0.12, 58.79, 42.46],
 [34.87, 45.07, 25.64, 4.74, 71.25, 31.57, 83.94],
 [32.61, 41.17, 98.27, 88.85, 30.23, 62.89, 84.26],
 [82.04, 17.88, 75.25, 56.83, 51.69, 91.16, 32.7],
 [66.66, 56.21, 39.0, 6.27, 87.61, 70.42, 56.06],
 [49.68, 22.95, 78.53, 98.12, 74.47, 18.45, 94.32]]
[[59.742, 5.339, 91.339, 20.221, 81.702, 45.815, 23.141],
 [32.716, 29.27, 89.193, 4.021, 79.846, 93.345, 61.367],
 [47.356, 33.87, 40.541, 68.483, 45.646, 64.898, 89.818],
 [84.371, 12.451, 76.413, 23.809, 0.591, 77.24, 12.813],
 [9.277, 31.923, 2.892, 68.653, 14.253, 14.225, 70.227],
 [91.887, 79.071, 13.206, 45.259, 73.019, 24.426, 82.332],
 [96.539, 6.743, 38.21, 55.292, 11.639, 56.902, 46.614],
 [36.961, 58.359, 79.174, 1.52, 38.937, 93.708, 25.964],
 [47.933, 62.434, 80.944, 54.694, 31.286, 84.219, 7.059],
 [82.522, 3.77, 85.51, 11.485, 83.059, 89.95, 38.618]]

没有必要重新设定种子,事实上这样做会适得其反。

你应该解释原始问题是什么以及你的解决方案是如何解决的。你应该解释原始问题是什么以及你的解决方案是如何解决的。我个人不太喜欢给矩阵赋值,而是直接填充它们,但感谢您的支持,它确实解决了问题。这样做只是为了向您展示一种正确的方法来预分配矩阵。我个人不太喜欢给矩阵赋值,而是直接填充它们,但感谢您的支持,它确实解决了问题。它只是以这种方式向您展示了一种正确的方法来预分配矩阵。是的,这可能更简单,但它没有说明我填写的内容。不过,很好地解释了这个问题,谢谢!是的,这可能更简单,但它并没有明确说明我在填写什么。不过,很好地解释了这个问题,谢谢!谢谢这就是我一直在寻找的。在Python中使用理解力是非常强大的,非常简单和干净。谢谢!这就是我一直在寻找的。在Python中,使用理解力是压倒一切的,而且简单明了。