2011-10-05 68 views
9

我想重複沿着軸線0和1軸的陣列的元件,用於分別M和N次:如何沿兩個軸重複一個數組的元素?

import numpy as np 

a = np.arange(12).reshape(3, 4) 
b = a.repeat(2, 0).repeat(2, 1) 
print(b) 

[[ 0 0 1 1 2 2 3 3] 
[ 0 0 1 1 2 2 3 3] 
[ 4 4 5 5 6 6 7 7] 
[ 4 4 5 5 6 6 7 7] 
[ 8 8 9 9 10 10 11 11] 
[ 8 8 9 9 10 10 11 11]] 

此工作原理,但我想知道是否有更好的方法,而沒有創建臨時數組。

+1

另請參閱[本文](http://stackoverflow.com/q/32846846/2566083)上使用kron,repeat和stride_tricks以及速度分析給出的答案。 – mlh3789

回答

6

您可以使用直積,看到numpy.kron

>>> a = np.arange(12).reshape(3,4) 
>>> print np.kron(a, np.ones((2,2), dtype=a.dtype)) 
[[ 0 0 1 1 2 2 3 3] 
[ 0 0 1 1 2 2 3 3] 
[ 4 4 5 5 6 6 7 7] 
[ 4 4 5 5 6 6 7 7] 
[ 8 8 9 9 10 10 11 11] 
[ 8 8 9 9 10 10 11 11]] 

你原來的方法也沒關係,但!

2

另一種解決方案是使用as_stridedkron比使用repeat要慢兩倍。我發現as_strided在很多情況下比雙重repeat快很多(小陣[< 250x250],每個維as_strided只有兩倍的速度變慢)。所述as_strided特技如下:

a = arange(1000000).reshape((1000, 1000)) # dummy data 

from numpy.lib.stride_tricks import as_strided 
N, M = 4,3 # number of time to replicate each point in each dimension 
H, W = a.shape 
b = as_strided(a, (H, N, W, M), (a.strides[0], 0, a.strides[1], 0)).reshape((H*N, W*M)) 

此工作原理是利用長度爲0的進步導致numpy的讀取相同的值多次(直到它到達下一個維度)。最後的reshape確實複製了數據,但只有一次不像使用將複製數據兩次的雙重repeat

+1

[這裏是鏈接](https://stackoverflow.com/a/32848377/3923281)到提出'as_strided'的解決方案,以及時間安排;-) –

相關問題