gpt4 book ai didi

python - 使用numpy构建两个数组的所有组合的数组

转载 作者:IT老高 更新时间:2023-10-28 12:35:05 25 4
gpt4 key购买 nike

在尝试对其进行任何复杂操作之前,我正在尝试遍历 6 参数函数的参数空间以研究其数值行为,因此我正在寻找一种有效的方法来执行此操作。

我的函数将 6 维 numpy 数组中给出的浮点值作为输入。我最初尝试做的是:

首先,我创建了一个函数,它接受 2 个数组并生成一个包含两个数组中所有值组合的数组:

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(一百万)个点,仅仅创建数组 values 就花费了超过 15 秒。

您知道使用 numpy 执行此操作的更有效方法吗?

如果有必要,我可以修改函数 F 接受它的参数的方式。

最佳答案

在较新版本的 numpy (>1.8.x) 中,numpy.meshgrid()提供更快的实现:

@pv 的解决方案

In [113]:

%timeit cartesian(([1, 2, 3], [4, 5], [6, 7]))
10000 loops, best of 3: 135 µs per loop
In [114]:

cartesian(([1, 2, 3], [4, 5], [6, 7]))

Out[114]:
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]])

numpy.meshgrid()以前只能是2D的,现在可以ND了。在这种情况下,3D:

In [115]:

%timeit np.array(np.meshgrid([1, 2, 3], [4, 5], [6, 7])).T.reshape(-1,3)
10000 loops, best of 3: 74.1 µs per loop
In [116]:

np.array(np.meshgrid([1, 2, 3], [4, 5], [6, 7])).T.reshape(-1,3)

Out[116]:
array([[1, 4, 6],
[1, 5, 6],
[2, 4, 6],
[2, 5, 6],
[3, 4, 6],
[3, 5, 6],
[1, 4, 7],
[1, 5, 7],
[2, 4, 7],
[2, 5, 7],
[3, 4, 7],
[3, 5, 7]])

请注意,最终结果的顺序略有不同。

关于python - 使用numpy构建两个数组的所有组合的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208118/

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