ordenar numeros multiplicacion matriz matrices llenar crear con arreglo aleatorios aleatoriamente python random numpy shuffle sampling

numeros - multiplicacion de matrices python numpy



Seleccione celdas al azar de la matriz NumPy, sin reemplazo (6)

Utilice random.sample para generar random.sample en 0 .. A. tamaño sin duplicados, luego divídalos en pares de índices:

import random import numpy as np def randint2_nodup( nsample, A ): """ uniform int pairs, no dups: r = randint2_nodup( nsample, A ) A[r] for jk in zip(*r): ... A[jk] """ assert A.ndim == 2 sample = np.array( random.sample( xrange( A.size ), nsample )) # nodup ints return sample // A.shape[1], sample % A.shape[1] # pairs if __name__ == "__main__": import sys nsample = 8 ncol = 5 exec "/n".join( sys.argv[1:] ) # run this.py N= ... A = np.arange( 0, 2*ncol ).reshape((2,ncol)) r = randint2_nodup( nsample, A ) print "r:", r print "A[r]:", A[r] for jk in zip(*r): print jk, A[jk]

Estoy escribiendo algunas rutinas de modelado en NumPy que necesitan seleccionar celdas al azar de una matriz NumPy y hacer algún procesamiento en ellas. Todas las celdas deben seleccionarse sin reemplazo (como en, una vez que se ha seleccionado una celda, no se puede seleccionar nuevamente, pero todas las celdas deben seleccionarse al final).

Estoy haciendo la transición de IDL, donde puedo encontrar una buena manera de hacerlo, pero supongo que NumPy tiene una buena manera de hacer esto también. ¿Qué sugieres?

Actualización: debería haber declarado que estoy tratando de hacer esto en matrices 2D y, por lo tanto, recuperar un conjunto de índices 2D.


¿Qué le numpy.random.shuffle usar numpy.random.shuffle o numpy.random.permutation si aún necesita la matriz original?

Si necesita cambiar la matriz in situ, entonces puede crear una matriz de índices como esta:

your_array = <some numpy array> index_array = numpy.arange(your_array.size) numpy.random.shuffle(index_array) print your_array[index_array[:10]]


Supongamos que tiene una matriz de puntos de datos de tamaño 8x3

data = np.arange(50,74).reshape(8,-1)

Si realmente quieres probar, como dices, todos los índices como 2d pares, la manera más compacta de hacer esto que puedo pensar es:

#generate a permutation of data''s size, coerced to data''s shape idxs = divmod(np.random.permutation(data.size),data.shape[1]) #iterate over it for x,y in zip(*idxs): #do something to data[x,y] here pass

Sin embargo, en general Moe, a menudo no es necesario acceder a las matrices de 2d como una matriz 2d simplemente para barajarlas, en cuyo caso una puede ser aún más compacta. solo haga una vista de 1d en la matriz y ahórrese algunas discusiones de índice.

flat_data = data.ravel() flat_idxs = np.random.permutation(flat_data.size) for i in flat_idxs: #do something to flat_data[i] here pass

Esto permutará la matriz 2d "original" como prefiera. Para ver esto, intente:

flat_data[12] = 1000000 print data[4,0] #returns 1000000


las personas que usan numpy versión 1.7 o posterior también pueden usar la función numpy.random.choice


Todas estas respuestas parecían un poco intrincadas para mí.

Supongo que tiene una matriz multidimensional a partir de la cual desea generar una lista exhaustiva de índices. Desea que estos índices se barajen para que pueda acceder a cada uno de los elementos de la matriz en un orden aleatorio.

El siguiente código hará esto de una manera simple y directa:

#!/usr/bin/python import numpy as np #Define a two-dimensional array #Use any number of dimensions, and dimensions of any size d=numpy.zeros(30).reshape((5,6)) #Get a list of indices for an array of this shape indices=list(np.ndindex(d.shape)) #Shuffle the indices in-place np.random.shuffle(indices) #Access array elements using the indices to do cool stuff for i in indices: d[i]=5 print d

La impresión d verificó que se haya accedido a todos los elementos.

Tenga en cuenta que la matriz puede tener cualquier cantidad de dimensiones y que las dimensiones pueden ser de cualquier tamaño.

El único inconveniente de este enfoque es que si d es grande, los indices pueden volverse bastante grandes. Por lo tanto, sería bueno tener un generador . Tristemente, no puedo pensar cómo construir un iterador mezclado sin ayuda.


Extendiendo la buena respuesta de @ WoLpH

Para una matriz 2D, creo que dependerá de lo que quiera o necesite saber sobre los índices.

Podrías hacer algo como esto:

data = np.arange(25).reshape((5,5)) x, y = np.where( a = a) idx = zip(x,y) np.random.shuffle(idx)

O

data = np.arange(25).reshape((5,5)) grid = np.indices(data.shape) idx = zip( grid[0].ravel(), grid[1].ravel() ) np.random.shuffle(idx)

A continuación, puede utilizar la lista idx para iterar sobre los índices de matriz bidimensional ordenados aleatoriamente como desee, y para obtener los valores en ese índice fuera de los data que permanecen sin cambios.

Nota : También puede generar los índices ordenados aleatoriamente a través de itertools.product también, en caso de que se sienta más cómodo con este conjunto de herramientas.