我试着通过6参数函数的参数空间来研究它的数值行为,然后再尝试做任何复杂的事情,所以我正在寻找一种有效的方法。
首先,我创建了一个函数,该函数接受两个数组,并生成一个数组,其中包含两个数组的所有值组合。
from numpy import *
def comb(a,b):
c = []
for i in a:
for j in b:
c.append(r_[i,j])
return c
然后我用reduce()
若要将此应用于同一个数组的m个副本,请执行以下操作:
def combs(a,m):
return reduce(comb,[a]*m)
然后我这样评价我的功能:
values = combs(np.arange(0,1,0.1),6)
for val in values:
print F(val)
这个很管用,但太慢了。我知道参数的空间很大,但这不应该太慢。在这个例子中,我只采样了106个(100万)点,仅仅创建数组就需要超过15秒的时间。values
。
你知道用Numpy做这件事的更有效的方法吗?
发布于 2018-03-26 16:38:13
这里是一个纯非常规的实现。是卡。比使用迭代工具快5×10。
import numpy as np
def cartesian(arrays, out=None):
"""
Generate a cartesian product of input arrays.
Parameters
----------
arrays : list of array-like
1-D arrays to form the cartesian product of.
out : ndarray
Array to place the cartesian product in.
Returns
-------
out : ndarray
2-D array of shape (M, len(arrays)) containing cartesian products
formed of input arrays.
Examples
--------
>>> cartesian(([1, 2, 3], [4, 5], [6, 7]))
array([[1, 4, 6],
[1, 4, 7],
[1, 5, 6],
[1, 5, 7],
[2, 4, 6],
[2, 4, 7],
[2, 5, 6],
[2, 5, 7],
[3, 4, 6],
[3, 4, 7],
[3, 5, 6],
[3, 5, 7]])
"""
arrays = [np.asarray(x) for x in arrays]
dtype = arrays[0].dtype
n = np.prod([x.size for x in arrays])
if out is None:
out = np.zeros([n, len(arrays)], dtype=dtype)
m = n / arrays[0].size
out[:,0] = np.repeat(arrays[0], m)
if arrays[1:]:
cartesian(arrays[1:], out=out[0:m,1:])
for j in xrange(1, arrays[0].size):
out[j*m:(j+1)*m,1:] = out[0:m,1:]
return out
https://stackoverflow.com/questions/-100007793
复制相似问题