如何解决如何通过元素向量加法和乘法来优化此元素
我正在尝试优化python代码的内部循环。我一直在阅读有关map和reduce的知识,但由于将这些概念也包含一个乘法,因此很难将它们应用到以下代码中。我的数据结构看起来像这样
while true; do … done
我在列表中有几个,我想计算列表中每个数组元素(即m,l,h)的总和。现在,我使用循环来遍历数组列表。可以使用map等完成此方案。但是,每个数组还带有一个符号(+1。vs -1)。有没有一种方法可以对此进行优化并使符号分开?
f.m: [NDArray[float]]
f.l: [NDArray[float]]
f.h: [NDArray[float]]
解决方法
避免上述循环的一种方法是在对象实例外部创建数据结构,然后使用numpy.view()在数据上创建单个视图。
与np.r_不同,np.view()不会创建数据的新副本,因此我们对数据所做的任何操作在所有其他视图中都是可见的(类似于共享内存)。
即,我们可以创建一个视图,其中f1.m和f2.m看起来彼此相邻,并且可以在视图上使用np.sum而不是在每个f1到fn上循环。尽管这在创建数据结构时会涉及少量开销,但是所有这些都可以在我们开始遍历数据之前完成。 最后但并非最不重要的一点是,可以通过对fm进行适当的分组来将乘法步骤移出循环(即,将所有带有正号的fm收集到一组中,对带有q负号的fm进行相同操作)。>
下面的代码说明了原理:
import numpy as np
# create the data structure first
rand = np.random.RandomState(42)
A = rand.randint(10,size=25).reshape(5,5)
row = np.arange(5)
# create some empty object instances
f1 = type('test',(object,),{})()
f2 = type('test',{})()
# Assign views into A to each object
f1.m = A.view()[row[:,np.newaxis],0]
f1.l = A.view()[row[:,3]
f2.m = A.view()[row[:,1]
f2.l = A.view()[row[:,2]
# Create view in such a way that we can directly sum the data
# in this case we want to add f1.m and f2.m
col = np.array([0,1])
C=A.view()[row[:,col]
# do the sum over the view which will then also be
# reflected in A
np.sum(C,axis=1)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。