Cómo convertir una matriz booleana en una matriz de índice en números

¿Existe un mecanismo Numpy eficiente para recuperar los índices enteros de las ubicaciones en una matriz basada en una condición que sea verdadera en lugar de la matriz de máscara booleana?

Por ejemplo:

x=np.array([range(100,1,-1)]) #generate a mask to find all values that are a power of 2 mask=x&(x-1)==0 #This will tell me those values print x[mask] 

En este caso, me gustaría saber los índices i de la mask donde mask[i]==True . ¿Es posible generar estos sin bucle?

Otra opción:

 In [13]: numpy.where(mask) Out[13]: (array([36, 68, 84, 92, 96, 98]),) 

que es lo mismo que numpy.where(mask==True) .

Debería poder usar numpy.nonzero() para encontrar esta información.

 np.arange(100,1,-1) array([100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2]) x=np.arange(100,1,-1) np.where(x&(x-1) == 0) (array([36, 68, 84, 92, 96, 98]),) 

Ahora reformule esto como:

 x[x&(x-1) == 0] 

Si prefiere el modo de indexador , puede convertir su lista booleana a una matriz numpy:

 print x[nd.array(mask)]