【发布时间】:2017-06-03 16:04:14
【问题描述】:
我正在处理大量 1 的数组,需要系统地从数组的各个部分中删除 0。大数组由许多较小的数组组成,对于每个较小的数组,我需要系统地将其上下三角形替换为 0。例如,我们有一个数组,其中包含由索引值指示的 5 个子数组(所有子数组的列数相同):
0 1 2
0 1.0 1.0 1.0
1 1.0 1.0 1.0
1 1.0 1.0 1.0
2 1.0 1.0 1.0
2 1.0 1.0 1.0
2 1.0 1.0 1.0
3 1.0 1.0 1.0
3 1.0 1.0 1.0
3 1.0 1.0 1.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
4 1.0 1.0 1.0
我希望每组行在其上下三角形中进行修改,使得生成的矩阵为:
0 1 2
0 1.0 1.0 1.0
1 1.0 1.0 0.0
1 0.0 1.0 1.0
2 1.0 0.0 0.0
2 0.0 1.0 0.0
2 0.0 0.0 1.0
3 1.0 0.0 0.0
3 1.0 1.0 0.0
3 0.0 1.0 1.0
3 0.0 0.0 1.0
4 1.0 0.0 0.0
4 1.0 1.0 0.0
4 1.0 1.0 1.0
4 0.0 1.0 1.0
4 0.0 0.0 1.0
目前我只使用 numpy 来实现这个结果数组,但我认为我可以使用 Pandas 分组来加速它。实际上,我的数据集非常大,将近 500,000 行。 numpy 代码如下:
import numpy as np
candidateLengths = np.array([1,2,3,4,5])
centroidLength =3
smallPaths = [min(l,centroidLength) for l in candidateLengths]
# This is the k_values of zeros to delete. To be used in np.tri
k_vals = list(map(lambda smallPath: centroidLength - (smallPath), smallPaths))
maskArray = np.ones((np.sum(candidateLengths), centroidLength))
startPos = 0
endPos = 0
for canNo, canLen in enumerate(candidateLengths):
a = np.ones((canLen, centroidLength))
a *= np.tri(*a.shape, dtype=np.bool, k=k_vals[canNo])
b = np.fliplr(np.flipud(a))
c = a*b
endPos = startPos + canLen
maskArray[startPos:endPos, :] = c
startPos = endPos
print(maskArray)
当我在我的真实数据集上运行它时,它需要将近 5-7 秒来执行。我认为这是由于这个巨大的 for 循环。如何使用 pandas 分组来实现更高的速度?谢谢
【问题讨论】:
标签: python arrays pandas numpy