Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将操作应用于矩阵的行(某些行除外)_Python_Numpy - Fatal编程技术网

Python 将操作应用于矩阵的行(某些行除外)

Python 将操作应用于矩阵的行(某些行除外),python,numpy,Python,Numpy,我有一个numpy矩阵M,我需要对矩阵的所有行应用一些操作,除了确定的行 例如,假设我有行[3,5],其元素应该避免像M[:,8]=4这样的操作。所以我想把第8列的所有行都设置为4,但我想避免对第3行和第5行这样做。如何在numpy中执行此操作 编辑:基本上,我需要这样做,以避免在对行的元素和进行规范化时被零除。有些行都是零,所以进行求和(即零)然后除以求和将得到除以零的结果。我要做的是找出哪些行都是零,然后我不想对那些特定的行执行规范化操作。也许是这样的 >>> import

我有一个
numpy
矩阵
M
,我需要对矩阵的所有行应用一些操作,除了确定的行

例如,假设我有行
[3,5]
,其元素应该避免像
M[:,8]=4这样的操作。所以我想把第8列的所有行都设置为4,但我想避免对第3行和第5行这样做。如何在
numpy
中执行此操作


编辑:基本上,我需要这样做,以避免在对行的元素和进行规范化时被零除。有些行都是零,所以进行求和(即零)然后除以求和将得到除以零的结果。我要做的是找出哪些行都是零,然后我不想对那些特定的行执行规范化操作。

也许是这样的

>>> import numpy as np
>>> M = np.arange(32).reshape(8, 4)
>>> ignore = {3, 5}
>>> rest = [i for i in xrange(M.shape[0]) if i not in ignore]
>>> M[rest, 3] = 4
>>> M
array([[ 0,  1,  2,  4],
       [ 4,  5,  6,  4],
       [ 8,  9, 10,  4],
       [12, 13, 14, 15],
       [16, 17, 18,  4],
       [20, 21, 22, 23],
       [24, 25, 26,  4],
       [28, 29, 30,  4]])

根据您的编辑,为了解决您的特定问题,即您似乎在使用非负条目操纵矩阵,您可以利用以下技巧

import numpy as np
rng = np.random.RandomState(42)
M = rng.randn(10, 10) ** 2
M[[0, 5]] = 0.  # set 2 lines to 0

M_norm = M / (M.sum(axis=1) + 1e-18)[:, np.newaxis]
显然,这个结果并不精确,但足够精确,不会注意到差异。为了让它稍微好一点,你也可以写

M_norm = M / np.maximum(M.sum(axis=1), 1e-18)[:, np.newaxis]
如果这仍然不够,并且您希望它是准确的,对于一般情况(允许负性),您可以编写

row_sums = M.sum(axis=1)
row_sums[row_sums == 0] = 1.

M_norm = M / row_sums[:, np.newaxis]  # dividing the zeros by 1 still yields 0
为了增加一些健壮性,您还可以

tolerance = 1e-6

row_sums = M.sum(axis=1)
OK_rows = np.abs(row_sums) > tolerance
M_norm = np.zeros_like(M)
M_norm[OK_rows] = M[OK_rows] / row_sums[OK_rows][:, np.newaxis]

一定有更有效的方法@AlexTwain根据您的编辑,关于
M[np.其中(M[:,8]!=0)[0],8]=4
?索引对我来说似乎相当有效…,在某些情况下,二进制掩码可能更好。当然,
rest
的构造可以做得更好,但这并不需要太多时间。另外,
rest
应该是一个数组,以避免一些严重的笑话,幸运的是,在第一个轴中进行索引时不会发生这些笑话,但在其他轴上可能会发生。否则,这个解决方案对我来说几乎没问题。你的应用程序仍然是谷歌矩阵吗?在这种情况下,你应该指出你的矩阵是巨大而稀疏的,因为这很重要。使用稀疏矩阵你可能需要调整一些东西。