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.