data_values = np.random.rand(10)
data_ind = np.random.randint(0,10,10)
data_values = (array([0.81444589, 0.57734696, 0.54130794, 0.22339518, 0.916973 ,
0.14956333, 0.74504583, 0.36218693, 0.17958372, 0.47195214]),
data_ind = array([7, 5, 2, 2, 0, 6, 6, 1, 4, 3]))
期望输出:
0 - 0.91693
1 - 0.36218693
2 - 0.54130794 + 0.22339518
3 - 0.47195214
4 - 0.17958372
5 - 0.57734696
6 - 0.14956333 + 0.74504583
output = array([0.916973, 0.36218694, 0.7647031, 0.47195214, 0.17958371, 0.577347, 0.89460915, 0.8144459], dtype=float32)
我写了很多东西
nodal_values = np.zeros(8, dtype=np.float32)
for nodes in range(8):
nodal_values[nodes] = np.sum(data_values[np.where(data == nodes)[0]])
上述方法需要大量时间,而
a = ((np.mgrid[:M,:N] == b)[0] * c).sum(axis=1)
为数百万的大数据提供内存错误
我正在寻找一种优化的方法
请签出stackoverflow question guidelines以便提出更好的问题,并正确设置问题格式
选择权
原始代码
这就是您想要为
N
的大值优化的内容(我自由地编辑了您的代码,使其没有硬编码的值,并修复了一个打字错误,data_values
而不是data
):稍好的版本(为了可读性)
我创建了以下版本,该版本提高了可读性并取消了
np.where
的使用:更好的版本
我在here中通过@Divakar实现了已接受的答案(一定要检查它以更好地理解它),具体到您的案例中:
比较
使用原始值:
我使用
timeit
模块(mean ± std. dev. of 7 runs, 10000000 loops each
)获得了以下性能:对于非常小的
N
值,即1到10,没有显著差异。然而,对于大型的,使用哪一个是毫无疑问的;带有for循环的两个版本花费的时间都太长,而矢量化实现的速度非常快测试它的代码
我希望这能帮助那些偶然发现这一点的人
相关问题 更多 >
编程相关推荐