我想创建一个NumPy的阵列具有稍微重复结构:特定的函数(这里,作为一个例子,shuffle()
),需要两个号码并返回阵列(这里与长度为8,可能会更多,但)。这些数组然后连接起来。高效地创建NumPy的阵列重复结构
import numpy
def shuffle(a, b):
return numpy.array([
[+a, +b], [-a, +b], [+a, -b], [-a, -b],
[+b, +a], [-b, +a], [+b, -a], [-b, -a],
])
pairs = [
(0.1, 0.2),
(3.14, 2.71),
# ... many, without a particular pattern ...
(0.707, 0.577)
]
out = numpy.concatenate([shuffle(*pair) for pair in pairs])
我想,这里所发生的是,长度为8的所有子阵列在内存独立创建,只是在马上被复制,形成更大的阵列out
。当存在许多对(a, b)
或当shuffle
被返回更多数据的东西所取代时,这会变得毫无必要地低效。解决此
一种方法是硬编码out
点菜
out = numpy.array([
[+0.1, +0.2],
[-0.1, +0.2],
# ...
[-0.2, -0.1],
[+3.14, +2.71],
# ...
])
但是这显然是不可取的要么。
在C中,我可能会使用预处理器分析的宏。
有关如何安排上述代码以避免不必要副本的任何提示?
你可以使用矩阵运算更有效地做到这一点,我期望。 – will
听起来像是为'itertools.permutations'构建的东西 –
如果您分配一个空数组'np.empty(dims)'然后逐块填充它,这将避免它。 –