Saltar al contenido

Función R rep() en Python (replica elementos de una lista/vector)

Este tutorial ha sido evaluado por especialistas para que tengas la seguridad de la exactitud de nuestra esta sección.

Solución:

Usar 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']

No estoy seguro de si hay una función integrada disponible para esto, pero puedes probar algo como esto:

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

Tenga en cuenta que sum() corre en tiempo cuadrático. 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']

Comparaciones de tiempo:

>>> 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

Ya que dices “array” y mencione R. Es posible que desee usar matrices numpy de todos modos, y luego use:

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

EDITAR: Como mencionas que también quieres repetir filas, 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 asume que tiene una lista o string multiplicar. Aunque lo admito, pasar todo como argumento a la cadena tal vez no sea perfecto, por lo que escribir su propio iterador puede ser mejor.

Nos puedes añadir valor a nuestro contenido informacional aportando tu experiencia en las anotaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *