Tengo dos matrices unidimensionales simples en NumPy . Debería poder concatenarlos usando numpy.concatenate . Pero recibo este error para el siguiente código:
TypeError: solo las matrices de longitud 1 se pueden convertir a escalares de Python
Código
import numpy
a = numpy.array([1, 2, 3])
b = numpy.array([5, 6])
numpy.concatenate(a, b)
¿Por qué?
python
arrays
numpy
concatenation
numpy-ndarray
highBandWidth
fuente
fuente
np.concatenat(..., axis)
. Si quieres apilarlos verticalmente, úsalosnp.vstack
. Si desea apilarlos (en múltiples matrices) horizontalmente, usenp.hstack
. (Si desea apilarlos en profundidad, es decir, la tercera dimensión, usenp.dstack
). Tenga en cuenta que estos últimos son similares a los pandaspd.concat
Respuestas:
La línea debe ser:
Las matrices que desea concatenar deben pasarse como una secuencia, no como argumentos separados.
De la documentación de NumPy :
Intentaba interpretar su
b
como el parámetro del eje, por lo que se quejó de que no podía convertirlo en un escalar.fuente
numpy.concatenate(a1, a2, a3)
onumpy.concatenate(*[a1, a2, a3])
si lo prefiere. Python es lo suficientemente fluido como para que la diferencia termine sintiéndose más cosmética que sustancial, pero es bueno cuando la API es consistente (por ejemplo, si todas las funciones numpy que toman listas de argumentos de longitud variable requieren secuencias explícitas).def concatx(*sequences, **kwargs)
). No es ideal, ya que parece que no puede nombrar los argumentos de palabras clave explícitamente en la firma de esta manera, pero hay soluciones alternativas.Hay varias posibilidades para concatenar matrices 1D, por ejemplo,
Todas esas opciones son igualmente rápidas para matrices grandes; para los pequeños,
concatenate
tiene una ligera ventaja:La trama se creó con perfplot :
fuente
np.concatenate
. Simplemente dan masajes a la lista de entrada de varias maneras antes de la mano.np.stack
por ejemplo, agrega una dimensión adicional a todas las matrices de entrada. Mira su código fuente. Soloconcatenate
se compila.np.concatenate
hace copias de las entradas. Este costo de memoria y tiempo supera el tiempo dedicado a "masajear" la entrada.El primer parámetro
concatenate
debería ser una secuencia de matrices para concatenar:fuente
Una alternativa es usar la forma abreviada de "concatenar" que es "r _ [...]" o "c _ [...]" como se muestra en el código de ejemplo a continuación (ver http://wiki.scipy.org / NumPy_for_Matlab_Users para obtener información adicional):
Lo que resulta en:
fuente
vector_b = [1,1,1,1] #short form of "array"
, esto simplemente no es cierto. vector_b será un tipo de lista Python estándar. Sin embargo, Numpy es bastante bueno para aceptar secuencias en lugar de forzar que todas las entradas sean tipos numpy.array.Aquí hay más enfoques para hacer esto usando
numpy.ravel()
,numpy.array()
utilizando el hecho de que las matrices 1D pueden descomprimirse en elementos simples:fuente
Algunos datos más de los documentos numpy :
Con sintaxis como
numpy.concatenate((a1, a2, ...), axis=0, out=None)
axis = 0 para concatenación en fila axis = 1 para concatenación en columna
Espero que ayude !
fuente