右随机矩阵是实数方阵,每行总和为 1。
这是一个您可以从中创建函数的示例,我把它留给您作为家庭作业
In [26]: import numpy as np
In [27]: N, M = 5, 5
In [28]: matrix = np.random.rand(N, M)
In [29]: matrix
Out[29]:
array([[ 0.27926909, 0.37026136, 0.35978443, 0.75216853, 0.53517512],
[ 0.93285517, 0.54825643, 0.43948394, 0.15134782, 0.31310007],
[ 0.91934362, 0.51707873, 0.3604323 , 0.78487053, 0.85757986],
[ 0.53595238, 0.80467646, 0.88001499, 0.4668259 , 0.63567632],
[ 0.83359167, 0.41603073, 0.21192656, 0.22650423, 0.95721952]])
In [30]: matrix = np.apply_along_axis(lambda x: x - (np.sum(x) - 1)/len(x), 1, matrix)
In [31]: matrix
Out[31]:
array([[ 0.01993739, 0.11092965, 0.10045272, 0.49283682, 0.27584341],
[ 0.65584649, 0.27124774, 0.16247526, -0.12566087, 0.03609139],
[ 0.43148261, 0.02921772, -0.12742871, 0.29700952, 0.36971886],
[ 0.07132317, 0.34004725, 0.41538578, 0.00219669, 0.17104711],
[ 0.50453713, 0.08697618, -0.11712798, -0.10255031, 0.62816498]])
解释
我们创建一个 N x M 矩阵
然后我们(sum - 1) / N
逐行计算要从每个项目中减去的
然后我们通过使用np.apply_along_axis()
withaxis=1
将其应用于矩阵的每一行以应用于每一行
验证结果
每行需要求和为 1
In [37]: matrix.sum(axis=1)
Out[37]: array([ 1., 1., 1., 1., 1.])
但是如何从行中的每个条目中减去该值?
在我的示例中,我使用了lambda
与此功能等效的
def subtract_value(x):
return x - (np.sum(x) - 1)/len(x)
您可以传递要apply_along_axis()
在轴上的每个元素上调用的函数,在我们的例子中是行
还有其他方法,例如numpy.vectorize()和numpy.frompyfunc
制作一个函数并像上面的任何方法一样应用它比遍历每一行中的每个项目更好,更快,更少的代码,更容易阅读/理解意图