2012-09-02 38 views
18

La función R rep() replica cada elemento de un vector:R rep() en Python (replica elementos de una lista/vector)

> rep(c("A","B"), times=2) 
[1] "A" "B" "A" "B" 

Esto es como la multiplicación lista en Python:

>>> ["A","B"]*2 
['A', 'B', 'A', 'B'] 

Pero con el representante de la función R() también es posible specifiy el número de repeticiones para cada elemento del vector:

> rep(c("A","B"), times=c(2,3)) 
[1] "A" "A" "B" "B" "B" 

¿Existe tal función disponible en Python? De lo contrario, ¿cómo podría uno definirlo? Por cierto, también estoy interesado en esa función para duplicar filas de una matriz.

Respuesta

23

Uso numpy matrices y la función numpy.repeat:

import numpy as np 

x = np.array(["A", "B"]) 
print np.repeat(x, [2, 3], axis=0) 

['A' 'A' 'B' 'B' 'B'] 
9

No estoy seguro si hay un built-in disponible para esto, pero se puede intentar algo como esto:

>>> lis = ["A", "B"] 
>>> times = (2, 3) 
>>> sum(([x]*y for x,y in zip(lis, times)),[]) 
['A', 'A', 'B', 'B', 'B'] 

en cuenta que se ejecuta en tiempo sum() cuadrática. Por lo tanto, no es la forma recomendada.

>>> from itertools import chain, izip, starmap 
>>> from operator import mul 
>>> list(chain.from_iterable(starmap(mul, izip(lis, times)))) 
['A', 'A', 'B', 'B', 'B'] 

comparions Timing:

>>> lis = ["A", "B"] * 1000 
>>> times = (2, 3) * 1000 
>>> %timeit list(chain.from_iterable(starmap(mul, izip(lis, times)))) 
1000 loops, best of 3: 713 µs per loop 
>>> %timeit sum(([x]*y for x,y in zip(lis, times)),[]) 
100 loops, best of 3: 15.4 ms per loop 
1
l = ['A','B'] 
n = [2, 4] 

Su ejemplo se utiliza cuerdas que son ya iterables. Puede producir una cadena de resultados que sea similar a una lista.

''.join([e * m for e, m in zip(l, n)]) 
'AABBBB' 

Actualización: la comprensión lista no se requiere aquí:

''.join(e * m for e, m in zip(l, n)) 
'AABBBB' 
+0

@AshwiniChaudhary Corregir ... para su solución - Pero como escribo arriba, sugiero que vaya con una cadena en lugar de una lista –

+1

pero puede omitir la parte de comprensión de la lista y usar simplemente: ''' join (e * m para e, m en zip (l, n)) ' –

+0

@AshwiniChaudhary ¡Genial! ... Thx ... actualizaré mi respuesta –

4

Dado que usted dice "matriz" y menciona R. Usted Puede querer usar matrices numpy de todos modos, y luego usar:

import numpy as np 
np.repeat(np.array([1,2]), [2,3]) 

EDITAR: Como mencionas que quieres repetir las filas también, creo que deberías usar numpy. np.repeat tiene un argumento de eje para hacer esto.

Aparte de eso, tal vez:

from itertools import izip, chain, repeat 
list(chain(*(repeat(a,b) for a, b in izip([1,2], [2,3])))) 

Como no hace la suposición de que haya una lista o una cadena de multiplicar. Aunque lo admito, pasar todo como argumento en cadena quizás no sea perfecto, así que escribir tu propio iterador puede ser mejor.

Cuestiones relacionadas