gpt4 book ai didi

python - 在 numpy/scipy 中矢量化 for 循环?

转载 作者:太空狗 更新时间:2023-10-30 03:07:52 25 4
gpt4 key购买 nike

我正在尝试向量化类方法中的 for 循环。 for 循环有以下形式:它遍历一堆点,并根据某个变量(下面称为“self.condition_met”)是否为真,在该点上调用一对函数,并将结果添加到列表中.这里的每个点都是列表向量中的一个元素,即看起来像 array([[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 被调用之前设置的,所以似乎没有必要每次都检查它,但我不确定如何更好地写这个。因为这里没有破坏性操作,所以我似乎可以将整个事情重写为矢量化操作——这可能吗?任何想法如何做到这一点?

最佳答案

这只需要几行 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]]

根据您的描述,我提取了这个流程:

  • 检查条件( bool 值)'if真的'
  • 对这些数据调用配对函数满足的点(行)条件
  • 附加每组调用的结果到列表(下面的“res”)

关于python - 在 numpy/scipy 中矢量化 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2670112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com