Python 在没有循环的情况下迭代函数

Python 在没有循环的情况下迭代函数,python,numpy,vectorization,Python,Numpy,Vectorization,我第三次问这个问题是因为它不够清楚,我希望现在能更容易理解: 我想在不使用循环的情况下迭代函数fn次 函数f返回(10,)个向量,并通过n次迭代运行。输出应该是一个(n,10)数组。我选择随机函数作为更复杂函数f的简单示例。参数f(x)是我尝试矢量化所必需的,除此之外,它显然是无用的 下面是一些例子,它们都应该做同样的事情。但没有一个是有效的 我听说numpy.vectorize通常是无效的,因为它是一个一致性函数。另一方面,有人告诉我,numpy提供了许多解决方案来实现我想做的事情 那么有人知

我第三次问这个问题是因为它不够清楚,我希望现在能更容易理解:

我想在不使用循环的情况下迭代函数fn次

函数f返回(10,)个向量,并通过n次迭代运行。输出应该是一个(n,10)数组。我选择随机函数作为更复杂函数f的简单示例。参数f(x)是我尝试矢量化所必需的,除此之外,它显然是无用的

下面是一些例子,它们都应该做同样的事情。但没有一个是有效的

我听说numpy.vectorize通常是无效的,因为它是一个一致性函数。另一方面,有人告诉我,numpy提供了许多解决方案来实现我想做的事情

那么有人知道什么numpy函数或过程比矢量化更有效吗

短暂性脑缺血发作


Numpy无法神奇地使某些复杂函数更快。您可能想在SE/Code Review上询问有关优化特定函数的建议,但在堆栈溢出问题上,这并不真正合适。请看。只是想澄清一下:在您的实际代码中,
f
是您自己的函数,您可以随时修改或重新实现,还是某个只返回数组的黑盒?@MisterMiyagi:它只返回数组。那么我认为您不能做任何“更好”的事情。只要
f
可以做任何常规的Python把戏,
numpy
就无法神奇地忽略这些约束。您已经找到了最佳的
numpy
方式,2d
rand
。它使用现有的编译
numpy
方法生成整个数组,而无需Python级迭代。只要你的
f
函数是一个需要调用100000次的Python函数,你就没有什么办法改变它<代码>迭代循环!

import numpy as np
import time


x=0
n_iterations = 100000
n_cols = 10


def f(x):
    return np.random.rand(1,n_cols)


# Speed comparison: 
start_time = time.time()
arr = np.random.rand(n_iterations,n_cols)
print("Run time: original function = {}".format(time.time() - start_time))
print(arr.shape)


# 1) for loop
start_time = time.time()
results1 = np.empty([n_iterations,n_cols]) 
for i in range(n_iterations):
    results1[i,] = f(x)

print("Run time: for loop = {}".format(time.time() - start_time))
print(results1.shape)
print(results1[0].shape)
#print(results1)

# 2) Faster but returns wrong array format
start_time = time.time()
f_vectorize = np.vectorize(f, otypes=[np.ndarray])
a = np.arange(n_iterations)
results2 = f_vectorize(a)

print("Run time: vectorize/arrange = {}".format(time.time() - start_time))
print(results2.shape)
print(results2[0].shape)
#print(results2)


# 3) vectorize/signature/arrange: 
start_time = time.time()
f_vectorize = np.vectorize(f, signature='()->(n)', otypes=[np.float32])
a = np.arange(n_iterations)
results3 = f_vectorize(a)

print("Run time: vectorize/signature/arrange= {}".format(time.time() - start_time))
print(results3.shape)
print(results3[0].shape)
#print(results3)