当前位置: 首页 > 面试题库 >

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

秦鸿羽
2023-03-14
问题内容

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

我的函数将6-dim 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)

这工作,但它的方式过于缓慢。我知道参数的空间很大,但这不应该太慢。在此示例中,我仅采样了10 6(一百万)个点,仅花费了15秒钟以上的时间便创建了数组values

您知道使用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]])

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



 类似资料:
  • 我有一个问题,给你两个数组,比如: 这意味着第一个数组中有5个数字,第二个数组中有3个数字。第二行是第一个数组,第三行是第二个数组。这个程序的目标是将第二个数组中的数字插入第一个数组(可以分开),从而使组合数组的所有位置都是奇数(第一、第三、第五……)数字加起来就是可能的最大数字。上述问题的输出示例: 既然阵列变成了 我试图利用第一个数组中的差异,通过 并找到差异最大的地方在第二个数组中插入数字。

  • 问题内容: 我在创建numpy数组的numpy数组时遇到问题。我将在一个循环中创建它: 所需结果: 实际结果: 可能吗?我不知道数组的最终尺寸,因此无法使用固定尺寸对其进行初始化。 问题答案: 永远不要在循环中追加数组:与基本的Python相比,这是NumPy非常不擅长的一项操作。这是因为您要对每个数据进行完整复制,这将花费您二次时间。 相反,只需将您的数组附加到Python列表中,并在最后进行转

  • 问题内容: 我有一个像这样的数组: 我试图得到这样的数组: 每行(具有固定的任意宽度)都移动一个。A的数组是10k记录长,我试图在Numpy中找到一种有效的方法。目前,我正在使用vstack和for循环,这很慢。有没有更快的方法? 编辑: 问题答案: 实际上,有一种更有效的方法来执行此操作…使用etc的缺点是,您正在复制数组。 顺便说一句,这实际上与@Paul的答案相同,但我将其发布只是为了更详细

  • 我如何从"CSV示例"创建一个像"最终结果"这样的数组? 背景 我正在构建一个用于测试的实验室文件系统,我想创建一个看起来有点像真实文件系统的文件夹结构。我有几个包含文件夹信息的CSV文件。 我想采用上面的每个组合,创建一个包含以下所有文件夹的文件系统。 一旦我有了上面所有完整路径的数组,就像做一样简单: 问题 我希望能够为任何CSV文件做到这一点,不管我有多少列,头名称是什么,或者每列有多少值。

  • 寻找一种优雅的方式以特殊的方式合并两个散列数组: 如果名称关键字匹配,则结果必须包含< code>new_data的所有名称散列,仅包含< code>old_data的额外数据。 我的第一次尝试是这样的,但是它创建了一个额外的散列: