Tengo una lista de objetos:
array = [object0,object1,object2,object3,object4]
Y quiero cambiar el orden de los elementos dados una permutación:
permutation = [ 2 , 4 , 0 , 1 , 3 ]
¿Hay un comando en Python que haga algo como:
result = Permute(array,permutation)
result = [object2,object4,object0,object1,object3]
Sé que puedo hacerlo con un simple for
bucle ...
5 respuestas
Si suponemos que permutation
es una permutación adecuada de 0-n
(cada una aparece exactamente una vez), entonces el siguiente código debería funcionar:
result=[array[i] for i in permutation]
Utilice el método aleatorio de numpy
import numpy as np
arr = np.arange(10)
np.random.shuffle(arr)
print(arr)
[1 7 5 2 9 4 3 6 0 8]
Referencia: https: //docs.scipy. org / doc / numpy-1.15.0 / reference / generate / numpy.random.shuffle.html
Solo por completo, una versión sin for en absoluto:
seed = ['foo', 'bar', 'baz']
permutation = [1, 2, 0]
result = map(lambda i: seed[i], permutation)
print result # --> ['bar', 'baz', 'foo']
Sin embargo, prefiero seguir con la lista de comprensión chicos. ;)
En Python, esto es fácil de hacer con una comprensión de la lista:
result = [array[i] for i in permutation]
Puede usar el intercambio de índices. Tienes dos conjuntos a y b
def swap_random(a, b):
"""Randomly swap entries in two arrays."""
# Indices to swap
swap_inds = np.random.random(size=len(a)) < 0.5 # your threshold
# Make copies of arrays a and b for output
a_out = np.copy(a)
b_out = np.copy(b)
# Swap values
a_out[swap_inds] = b[swap_inds]
b_out[swap_inds] = a[swap_inds]
return a_out, b_out
Entonces, haz la prueba
d = np.array(range(0,15))
r = np.array(range(16,31))
display(d,r)
>>> array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> array([16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])
display(swap_random(d, r))
>>> (array([ 0, 17, 2, 3, 20, 21, 22, 7, 24, 25, 10, 11, 28, 13, 14]),
>>> array([16, 1, 18, 19, 4, 5, 6, 23, 8, 9, 26, 27, 12, 29, 30]))
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.