Numpy array TypeError: solo las matrices escalares enteras se pueden convertir en un índice escalar

i=np.arange(1,4,dtype=np.int) a=np.arange(9).reshape(3,3) 

y

 a >>>array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) a[:,0:1] >>>array([[0], [3], [6]]) a[:,0:2] >>>array([[0, 1], [3, 4], [6, 7]]) a[:,0:3] >>>array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) 

Ahora quiero vectorizar la matriz para imprimirlos todos juntos. lo bash

 a[:,0:i] 

o

 a[:,0:i[:,None]] 

Da TypeError: solo las matrices escalares enteras se pueden convertir en un índice escalar

Respuesta corta:

 [a[:,:j] for j in i] 

Lo que estás tratando de hacer no es una operación vectorizable . Wikipedia define la vectorización como una operación por lotes en una sola matriz, en lugar de en escalares individuales:

En informática, los lenguajes de progtwigción de matrices (también conocidos como lenguajes vectoriales o multidimensionales) generalizan las operaciones en escalares para aplicar de manera transparente a vectores, matrices y matrices de dimensiones superiores.

… una operación que opera en matrices completas se puede llamar una operación vectorizada

En términos de optimización a nivel de CPU, la definición de vectorización es:

“Vectorización” (simplificado) es el proceso de reescritura de un bucle para que, en lugar de procesar un solo elemento de una matriz N veces, procese (digamos) 4 elementos de la matriz simultáneamente N / 4 veces.

El problema con su caso es que el resultado de cada operación individual tiene una forma diferente : (3, 1) , (3, 2) y (3, 3) . No pueden formar la salida de una sola operación vectorizada, porque la salida debe ser una matriz contigua. Por supuesto, puede contener arrays (3, 1) , (3, 2) y (3, 3) dentro de ella (como vistas), pero eso es lo que ya hace su matriz original.

Lo que realmente estás buscando es solo una expresión que los computa a todos:

 [a[:,:j] for j in i] 

… pero no está vectorizado en un sentido de optimización del rendimiento. Debajo del capó, está completamente viejo for bucle que calcula cada elemento uno por uno.

intente lo siguiente para cambiar su matriz a 1D

 a.reshape((1, -1)) 

Puede usar numpy.ravel para devolver una matriz aplanada de una matriz n-dimensional:

 >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> a.ravel() array([0, 1, 2, 3, 4, 5, 6, 7, 8]) 

Esto podría no estar relacionado con este problema específico, pero me topé con un problema similar en el que usé la indexación NumPy en una lista de Python y obtuve el mismo mensaje de error:

 # incorrect weights = list(range(1, 129)) + list(range(128, 0, -1)) mapped_image = weights[image[:, :, band] # image.shape = [800, 600, 3] # TypeError: only integer scalar arrays can be converted to a scalar index 

Resulta que necesitaba convertir los weights , una lista Python 1D, en una matriz NumPy antes de poder aplicar la indexación NumPy multidimensional. El siguiente código funciona:

 # correct weights = np.array(list(range(1, 129)) + list(range(128, 0, -1))) mapped_image = weights[image[:, :, band] # image.shape = [800, 600, 3] 

Tuve un problema similar y lo resolví usando la lista … no estoy seguro de si esto ayudará o no

 classes = list(unique_labels(y_true, y_pred))