Sé la diferencia entre np.random.permutation y np.random.shuffle.

Pero cuando uso el np.random.permutation para pd.Series, causará accidentalmente un cambio en la serie y también un cambio en el marco de datos.

Sé cómo permutarlo de otra manera, pero quiero saber si este problema de diseño para numpy o pandas?

Los datos de demostración muestran:

import pandas as pd
import numpy as np
t = pd.Series([1,2,3,4])
#np.random.permutation(t)
assert all(t == np.random.permutation(t))

No aumentará AssertionError. Producirá una matriz aleatoria. Pero cuando marca el t, también cambia.

Si usa np.array o list, estará bien.

t = np.array([1,2,3,4])
np.random.permutation(t)
assert all(t == np.random.permutation(t))

Aumentará AssertionError.

1
tianhua liao 17 oct. 2018 a las 04:47

2 respuestas

La mejor respuesta

Eso es un error en numpy. Para algunos objetos con forma de matriz, numpy.random.permutation baraja su argumento en su lugar. Según la cadena de documentos, se supone que devuelve una copia aleatoria de la entrada; no debería cambiar la entrada en el lugar.

Como señaló en la pregunta, puede evitar el problema pasando una matriz numpy real. Si t es un Pandas Series, puede usar np.random.permutation(t.values).

1
Warren Weckesser 17 oct. 2018 a las 03:36

Agregué un bucle para verificar la función de aserción, y usé .any () para reemplazar "todos".

import numpy as np

for i in range(100):
    t = np.array([1, 2, 3, 4])
    assert (t != np.random.permutation(t)).any(), print('Assertion at', i)

Los resultados mostraron que la aserción sucedía al azar.

0
Amy Chou 17 oct. 2018 a las 02:35