【发布时间】:2016-03-23 22:21:05
【问题描述】:
我目前正在尝试用 Numpy 中的矢量化操作替换此代码块中的 for 循环:
def classifysignal(samplemat, binedges, nbinmat, nodatacode):
ndata, nsignals = np.shape(samplemat)
classifiedmat = np.zeros(shape=(ndata, nsignals))
ncounts = 0
for i in range(ndata):
for j in range(nsignals):
classifiedmat[i,j] = nbinmat[j]
for e in range(nbinmat[j]):
if samplemat[i,j] == nodatacode:
classifiedmat[i,j] == nodatacode
break
elif samplemat[i,j] <= binedges[j, e]:
classifiedmat[i,j] = e
ncounts += 1
break
ncounts = float(ncounts/nsignals)
return classifiedmat, ncounts
但是,我在概念化如何替换第三个 for 循环(即以 for e in range(nbinmat[j]) 开头的循环)时遇到了一些麻烦,因为它需要在分配值之前将两个单独矩阵的各个元素与这些的索引进行比较元素(i 和 e)彼此完全解耦。有没有一种简单的方法可以使用整个数组操作来做到这一点,或者最好还是坚持使用 for 循环?
PS:我的第一个 Stackoverflow 问题,所以如果有任何不清楚/需要更多详细信息,请告诉我!谢谢。
【问题讨论】:
-
为什么将第一个“if”语句放在 for loop over range(nbinmat[j]) 中?我看什么都靠e里面的吗?此外,“classifiedmat[i,j] == nodatacode”不应该是“classifiedmat[i,j] = nodatacode”吗?
-
问题出在 elif 子句中,就像你说的那样。也许这段代码不能完全重写(虽然有些部分可以),但也许“更大的图景”可以?如果您可以阐明您实际想要做什么(
binedges来自哪里,为什么需要将数组的每个元素与可能交错的数组中的元素进行比较),那么也许更多的帮助是可用。
标签: python numpy matrix vectorization