如何在python中随机化矩阵中的所有项目

时间:2016-02-21 22:36:59

标签: python function numpy matrix numpy-random

我正在尝试创建一个接受矩阵的函数,并使用python将随机变量分配给所述矩阵的每个项目。

看起来相当简单,但我似乎无法让它发挥作用。我完成的两次最接近的尝试是:

def MatrixRandomize(v):
    for rows in v:
        for columns in rows:
            columns = random.random()

def MatrixRandomize(v):
    for rows in v:
        for columns in rows:
            rows[columns] = random.random()

对于最初充满0的3 * 3矩阵,第一个函数给出了这个:

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

第二个给我这个:

[[0.5405554380526916, 0, 0], [0.1376271091010769, 0, 0], [0.5223432054353907, 0, 0]]

根据我的理解,我认为第二个功能应该有效。我已经看到有其他方法可以解决这个问题,比如使用numpy,但我无法理解这背后的逻辑不起作用。

有人能在我的代码中发现错误吗?。

2 个答案:

答案 0 :(得分:0)

这不是Python的工作原理。当你写

for columns in rows:

然后,在每次迭代中,名称columns被绑定在namespace对象中。如果你写在身体

    columns = random.random()

然后它只是将它绑定到另一个对象 - 它不会改变原始矩阵中的任何内容。

为了实际更改矩阵的值,您需要更改其实际值。您没有指定您正在使用的矩阵库,但可能与此类似的东西将起作用:

for i in range(len(v.num_rows)):
    for j in range(len(v.num_cols)):
        v[i][j] = random.random()

如果您使用的是numpy,请参阅numpy.random模块以获得更有效的替代方案:

import numpy as np

def MatrixRandomize(v):
    np.copyto(v, np.random.random(v.shape))

v = np.zeros((2, 3))
MatrixRandomize(v)
>>> v
array([[ 0.19700515,  0.82674963,  0.04401973],
     [ 0.03512609,  0.1849178 ,  0.40644165]])

答案 1 :(得分:0)

我终于明白了什么是错的。

我想做的正确方法是:

def MatrixRandomize(v):
    for rows in v:
        for columns in range(len(rows)):
            rows[columns] = random.random()

但是现在我理解了逻辑中缺失的链接。谢谢!