【发布时间】:2021-07-08 18:29:46
【问题描述】:
我有一个相当大的m 倍n numpy 矩阵M 填充非零值和一个长度为m 的数组x,其中每个条目表示行索引,之后矩阵元素应该设置为零。所以例如,如果n=5和x[i]=3,那么矩阵的第i行设置为[M_i1, M_i2, M_i3, 0, 0]。
如果x 的所有条目都具有相同的值k,我可以简单地使用像M[:,k:]=0 这样的切片,但我无法找到一种有效的方法来处理每一行的不同值而不循环所有行并为每一行使用切片。
我想创建一个看起来像 [[1]*x[1] + [0]*(n-x[1]),...,[1]*x[m] + [0]*(n-x[m])] 的矩阵并将其用于布尔索引,但也不知道如何在不循环的情况下创建它。
非矢量化解决方案如下所示:
for i in range(m):
if x[i] < n:
M[i,x[i]:] = 0
示例输入
M = np.array([[1,2,3],[4,5,6]])
m, n = 2, 3
x = np.array([1,2])
和输出
array([[1, 0, 0],
[4, 5, 0]])
有人有这个问题的矢量化解决方案吗?
非常感谢!
【问题讨论】:
-
你好,发布非矢量化解决方案?
-
@ce.teuf 添加了它
-
请贴出输入输出样例
-
那么一些
x可能太大了?这些行不应该发生任何事情? -
@hpaulj x 的最大值是 n,所以它只会发生它太大的值 1。
标签: python numpy matrix indexing vectorization