我正在尝试使用类方法中的for循环进行矢量化。 for循环具有以下形式:它遍历一堆点并依赖于某个变量(下面称为“self.condition_met”)是否为真,在该点上调用一对函数,并将结果添加到列表中。这里的每个点都是列表向量中的元素,即看起来像数组的数据结构([[1,2,3],[4,5,6],...])。这是有问题的功能:
def myClass:
def my_inefficient_method(self):
final_vector = []
# Assume 'my_vector' and 'my_other_vector' are defined numpy arrays
for point in all_points:
if not self.condition_met:
a = self.my_func1(point, my_vector)
b = self.my_func2(point, my_other_vector)
else:
a = self.my_func3(point, my_vector)
b = self.my_func4(point, my_other_vector)
c = a + b
final_vector.append(c)
# Choose random element from resulting vector 'final_vector'
self_condition_met在调用my_inefficient_method之前设置,所以似乎没有必要每次检查它,但我不知道如何更好地编写它。由于这里没有破坏性操作,似乎我可以将整个事物重写为矢量化操作 - 这可能吗?任何想法如何做到这一点?
答案 0 :(得分:2)
你可以重写my_funcx
进行矢量化吗?如果是这样,你可以做
def myClass:
def my_efficient_method(self):
# Assume 'all_points', 'my_vector' and 'my_other_vector' are defined numpy arrays
if not self.condition_met:
a = self.my_func1(all_points, my_vector)
b = self.my_func2(all_points, my_other_vector)
else:
a = self.my_func3(all_points, my_vector)
b = self.my_func4(all_points, my_other_vector)
final_vector = a + b
# Choose random element from resulting vector 'final_vector'
答案 1 :(得分:2)
这只需要NumPy中的几行代码(其余的只是创建数据集,几个函数和设置)。
import numpy as NP
# create two functions
fnx1 = lambda x : x**2
fnx2 = lambda x : NP.sum(fnx1(x))
# create some data
M = NP.random.randint(10, 99, 40).reshape(8, 5)
# creates index array based on condition satisfaction
# (is the sum (of that row/data point) even or odd)
ndx = NP.where( NP.sum(M, 0) % 2 == 0 )
# only those data points that satisfy the condition (are even)
# are passed to one function then another and the result off applying both
# functions to each data point is stored in an array
res = NP.apply_along_axis( fnx2, 1, M[ndx,] )
print(res)
# returns: [[11609 15309 15742 12406 4781]]
根据你的描述我抽象了这个流程:
答案 2 :(得分:0)
最好做mtrw,但如果你不确定矢量化,你可以在my_func
上尝试numpy.vectorize
http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html