我想創建一個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)'然後逐塊填充它,這將避免它。 –