numeros - obtener un numero aleatorio en python
Numpy: obtenga un conjunto aleatorio de filas de la matriz 2D (4)
Tengo una matriz 2D muy grande que se ve así:
a=
[[a1, b1, c1],
[a2, b2, c2],
...,
[an, bn, cn]]
Usando Numpy, ¿hay alguna manera fácil de obtener una nueva matriz 2D con, por ejemplo, 2 filas aleatorias de la matriz inicial a (sin reemplazo)?
p.ej
b=
[[a4, b4, c4],
[a99, b99, c99]]
Esta es una publicación anterior, pero esto es lo que funciona mejor para mí:
A[np.random.choice(A.shape[0], num_rows_2_sample, replace=False)]
cambie el reemplazo = Falso a Verdadero para obtener lo mismo, pero con reemplazo.
Otra opción es crear una máscara aleatoria si solo desea reducir sus datos por cierto factor. Supongamos que quiero reducir la muestra al 25% de mi conjunto de datos original, que actualmente se encuentra en la matriz data_arr
:
# generate random boolean mask the length of data
# use p 0.75 for False and 0.25 for True
mask = numpy.random.choice([False, True], len(data_arr), p=[0.75, 0.25])
Ahora puede llamar a data_arr[mask]
y devolver ~ 25% de las filas, muestreadas al azar.
Si necesita las mismas filas pero solo una muestra aleatoria, entonces,
import random
new_array = random.sample(old_array,x)
Aquí x, tiene que ser un ''int'' que define la cantidad de filas que desea seleccionar al azar.
>>> A = np.random.randint(5, size=(10,3))
>>> A
array([[1, 3, 0],
[3, 2, 0],
[0, 2, 1],
[1, 1, 4],
[3, 2, 2],
[0, 1, 0],
[1, 3, 1],
[0, 4, 1],
[2, 4, 2],
[3, 3, 1]])
>>> idx = np.random.randint(10, size=2)
>>> idx
array([7, 6])
>>> A[idx,:]
array([[0, 4, 1],
[1, 3, 1]])
Poniéndolo juntos para un caso general:
A[np.random.randint(A.shape[0], size=2), :]
Para no reemplazo (numpy 1.7.0+):
A[np.random.choice(A.shape[0], 2, replace=False), :]
No creo que haya una buena forma de generar una lista aleatoria sin reemplazo antes de 1.7. Tal vez pueda configurar una definición pequeña que asegure que los dos valores no sean los mismos.