Python 如何在没有numpy的情况下生成随机矩阵
我遇到了这个问题:创建一个没有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
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中,使用理解力是压倒一切的,而且简单明了。