python - tutorial - Numpy array TypeError: solo las matrices escalares enteras se pueden convertir en un índice escalar
numpy tutorial español pdf (4)
Esto podría no estar relacionado con este problema específico, pero me encontré 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 de 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]
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 intento
a[:,0:i]
o
a[:,0:i[:,None]]
Da TypeError: solo las matrices escalares enteras se pueden convertir en un índice escalar
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])
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 ciencias de la computación, los lenguajes de programació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 arreglos completos 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ó, es viejo for
bucle que calcula cada elemento uno por uno.
intente lo siguiente para cambiar su matriz a 1D
a.reshape((1, -1))