【发布时间】:2018-04-30 15:29:48
【问题描述】:
我有一个长度为 n 的 numpy 数组 f 和一个长度为 n x 的 numpy 矩阵 A em>m。我想将 f 和 A 分成 r 部分 f1,...,fr 和 A1,...,Ar,然后进行计算 fi*Ai(数学意义上的向量 x 矩阵乘法)每个 fi 是一个行向量,其列数等于 Ai 的行数。结果将是一个 1 x m 的行向量。这个想法是连接所有这些行向量以形成矩阵 B = [ [f1*A1], [f2*A2],..., [fr*Ar] ] (请注意,这将是一个大小为 r x m) 的矩阵。
假设 f 和 A 已经定义。还假设片段的相应索引在列表 [0,d1,...dr] 中。例如,f1 = f[d[0]:d[1]] 和 f2 = f[d[1]:d[2]])。我正在使用以下代码来解决我的问题:
B = numpy.zeros([r,m])
for i in range(0,r):
lower = d[i]
upper = d[i+1]
B[i,:] = f[lower:upper].dot(A[lower:upper,:])
问题是这段代码将在我的程序中计算多次。我之前听说 Python for 循环很慢,实际上我的代码的瓶颈就是这部分。我不知道如何对其进行矢量化,但我觉得这是可能的。我希望这里有人能给我指路。谢谢。
【问题讨论】:
-
如果我从0开始,那么
B[i-1,:]会给你一个负索引 -
能否提供测试数据?
-
但是你应该可以这样做:
index = np.column_stack((d[:-1],d[1:]))然后B = f[index].dot(A[index,:]) -
@obchardon 抱歉,应该是 i,而不是 i-1。
-
给我minimal reproducible example。一个好的答案将使用一个带有实数的具体示例。这是为了清楚起见,并证明答案是正确的。我更喜欢使用您提供的示例,而不是自己编造一个。它更容易,并且需要的假设更少。
标签: python numpy for-loop matrix