Ok, here's my best shot at a generalized repmat: def reparray(A, tup): if numpy.isscalar(tup): tup = (tup,) d = len(tup) A = numpy.array(A,copy=False,subok=True,ndmin=d) for i,k in enumerate(tup): A = numpy.concatenate([A]*k, axis=i) return A
Can anyone improve on this? The only way I could think to seriously improve it would be if there were an N-way concatenate() function in the C-API. Each call to concatenate() involves a potentially big allocation and memcpy of the data. And here's a docstring for it: """Repeat an array the number of times given in the integer tuple, tup. Similar to repmat, but works for arrays of any dimension. reparray(A,(m,n)) is equivalent to repmat(A,m,n) If tup has length d, the result will have dimension of max(d, A.ndim). If tup is scalar it is treated as a 1-tuple. If A.ndim < d, A is promoted to be d-dimensional by prepending new axes. So a shape (3,) array is promoted to (1,3) for 2-D replication, or shape (1,1,3) for 3-D replication. If this is not the desired behavior, promote A to d-dimensions manually before calling this function. If d < A.ndim, ndim is effectively promoted to A.ndim by appending 1's to tup. Examples: >>> a = array([0,1,2]) >>> reparray(a,2) array([0, 1, 2, 0, 1, 2]) >>> reparray(a,(1,2)) array([[0, 1, 2, 0, 1, 2]]) >>> reparray(a,(2,2)) array([[0, 1, 2, 0, 1, 2], [0, 1, 2, 0, 1, 2]]) >>> reparray(a,(2,1,2)) array([[[0, 1, 2, 0, 1, 2]], [[0, 1, 2, 0, 1, 2]]]) See Also: repmat, repeat """ ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Numpy-discussion mailing list Numpy-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/numpy-discussion