给定N个输入数组,所有任意长度,我希望能够对每个数组的每个组合应用一个函数。你知道吗
例如:
给定输入数组:
[1, 2]
[3, 4, 5]
[6, 7, 8, 9]
以及一个返回N个元素乘积的函数
我希望能够将函数应用于这些元素的每个组合。在本例中,它将生成一个长度分别为2、3和4的三维数组。你知道吗
生成的数组如下所示:
[
[
[18, 21, 24, 27],
[24, 28, 32, 36],
[30, 35, 40, 45]
],
[
[36, 42, 48, 54],
[48, 56, 64, 72],
[60, 70, 80, 90]
]
]
Tags:
设N个数组的大小为n1,n2,…,nN。 然后,我们可以把这个问题分成两个数组的(N-1)计算。 在第一次计算中,计算n1,n2的乘积。 让输出为result1。 在第二次计算中,计算结果1,n3的乘积。 让输出为result2。 . . 在最后一次计算中,计算结果(N-2)的乘积nN。 让输出为结果(N-1)。你知道吗
你会知道结果1的大小是n2\n1, 结果2的大小是n3\n2\n1。 . . 你可以推断,结果(N-1)的大小是N(N)\N(N-1)\u。。。_n2*n1。你知道吗
现在我们给出两个数组:result(k-1)和arr(k)。 然后我们应该从结果(k-1)和arr(k)得到每个元素的乘积。 原因-结果(k-1)的大小为n(k-1)\n(k-2)\u。。。_n1,arr(k)的大小为n(k), 输出数组(结果(k))的大小应为n(k)\n(k-1)\u。。。_n1型。 这意味着这个问题的解是转置n(k)和结果(k-1)的点积。 所以,函数应该如下所示。你知道吗
现在我们来解决第一个问题。 剩下的就是把它应用到所有N个数组。 所以这个解可能是迭代的。 让输入数组有N个数组。你知道吗
整个代码可能在下面。你知道吗
另一种方法是np.frompyfunc公司创建所需函数的ufunc。对于n个参数,这是与ufuncs.outer方法一起应用n-1次的方法。你知道吗
您可以通过广播来实现这一点:
输出:
通过构造适当的切片来传递给操作数,这可以很容易地得到推广。你知道吗
编辑
这种概括的实现可以是:
这里不需要递归,我也不确定它有什么好处。你知道吗
另一种方法是从Python函数生成^{} (如@TlsChris's answer)并使用其^{} 方法:
虽然这会得到相同的结果(对于1D阵列),但这比广播方法慢(根据输入大小从轻微到相当多)。你知道吗
此外,虽然
apply_multi_broadcast_1d()
仅限于一维输入,但apply_multi_outer()
也适用于高维的输入数组。广播方法可以容易地适应更高维度的输入,如下所示。你知道吗编辑2
将
apply_multi_broadcast_1d()
概括为N-dim输入,包括将广播与函数应用分离,如下所示:三者的基准表明
apply_multi_broadcast()
略慢于apply_multi_broadcast_1d()
,但比apply_multi_outer()
快:相关问题 更多 >
编程相关推荐