我是使用NumPy的新手,但我相信它是我加速代码所需的工具。以下是我希望我的代码完成的内容:
对于2D numpy数组(T)中的每一行,我想知道对于另一个数组(T_cuts)中的每个截止值,满足依赖于截止值的四个条件中的每一个的元素数量,所有这些都用作as尽可能少的循环。
这是一个关于如何使用for循环来完成此任务的草图:
for row in T:
classification_counts = []
for cut in T_cuts:
results = []
for element in row:
results.append(classify(element, cut))
ones = results.count(1)
twos = results.count(2)
threes = results.count(3)
fours = results.count(4)
classification_counts.append([ones, twos, threes, fours])
辅助函数classify
只返回1,2,3或4,具体取决于T
元素与T_cuts
的截止值之间的关系。
对于这个问题T.shape == (1000000,80)
和T_cuts.shape == (3000,1)
,所以使用循环已经证明太慢了。
编辑:包括classify
的完整定义。数组corr_stats
包含T
的每个元素来自何处的信息,第一列是" type1"或" type2"。
def classify(cutoff, element):
i, j = np.where( T == element )
if element >= cutoff and corr_stats[j,0] == "type1":
return 1
elif element >= cutoff and corr_stats[j,0] == "type2":
return 2
elif element < cutoff and corr_stats[j,0] == "type2":
return 3
elif element < cutoff and corr_stats[j,0] == "type1":
return 4
else:
return 0
答案 0 :(得分:0)
我将只讨论最里面的循环:
results = []
for element in row:
results.append(classify(element, cut))
ones = results.count(1)
twos = results.count(2)
threes = results.count(3)
fours = results.count(4)
classification_counts.append([ones, twos, threes, fours])
这里我们在行中每个单元格调用classify()
一次,唯一重要的结果是我们得到的每个值的数量。
要消除内循环,我们需要做这样的事情:
classification_counts.append(classify(row, cut))
所以:
def classify(row, cutoff):
greater = row >= cutoff
one = corr_stats == 1
two = corr_stats == 2
return \
(greater & one).sum(),
(greater & two).sum(),
(~greater & two).sum(),
(~greater & one).sum()
以上假设corr_stats
转换为提高效率。具体来说,您应该用数字1和2替换“type1”和“type2”字符串,并组织corr_stats使其与行值对齐,以避免必须使用np.where()
在T中查找每个元素的位置。最后一部分可能需要一些思考(我不知道如何完全弄明白)。