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
应该是一个数组,以避免一些严重的笑话,幸运的是,在第一个轴中进行索引时不会发生这些笑话,但在其他轴上可能会发生。否则,这个解决方案对我来说几乎没问题。你的应用程序仍然是谷歌矩阵吗?在这种情况下,你应该指出你的矩阵是巨大而稀疏的,因为这很重要。使用稀疏矩阵你可能需要调整一些东西。