python - index - numpy stack
Concatenar dos matrices NumPy unidimensionales (4)
Tengo dos matrices unidimensionales simples en NumPy . Debería ser capaz de concatenarlos usando numpy.concatenate . Pero obtengo 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é?
El primer parámetro para concatenate
debería ser una secuencia de matrices para concatenar:
numpy.concatenate((a,b)) # Note the extra parentheses.
Hay varias posibilidades para concatenar matrices 1D, por ejemplo,
numpy.r_[a, a],
numpy.stack([a, a]).reshape(-1),
numpy.hstack([a, a]),
numpy.concatenate([a, a])
Todas esas opciones son igualmente rápidas para matrices grandes; para los pequeños, concatenate
tiene una ligera ventaja:
La trama fue creada con perfplot :
import numpy
import perfplot
perfplot.show(
setup=lambda n: numpy.random.rand(n),
kernels=[
lambda a: numpy.r_[a, a],
lambda a: numpy.stack([a, a]).reshape(-1),
lambda a: numpy.hstack([a, a]),
lambda a: numpy.concatenate([a, a])
],
labels=[''r_'', ''stack+reshape'', ''hstack'', ''concatenate''],
n_range=[2**k for k in range(19)],
xlabel=''len(a)'',
logx=True,
logy=True,
)
La línea debería ser:
numpy.concatenate([a,b])
Las matrices que desea concatenar deben pasarse como una secuencia, no como argumentos separados.
De la numpy.concatenate :
numpy.concatenate((a1, a2, ...), axis=0)
Únete a una secuencia de matrices juntas.
Intentaba interpretar tu b
como el parámetro del eje, por lo que se quejó de que no podía convertirlo en escalar.
Una alternativa es usar la forma abreviada de "concatenar" que sea "r _ [...]" o "c _ [...]" como se muestra en el código de ejemplo debajo (ver http://wiki.scipy.org/NumPy_for_Matlab_Users para información adicional):
%pylab
vector_a = r_[0.:10.] #short form of "arange"
vector_b = array([1,1,1,1])
vector_c = r_[vector_a,vector_b]
print vector_a
print vector_b
print vector_c, ''/n/n''
a = ones((3,4))*4
print a, ''/n''
c = array([1,1,1])
b = c_[a,c]
print b, ''/n/n''
a = ones((4,3))*4
print a, ''/n''
c = array([[1,1,1]])
b = r_[a,c]
print b
print type(vector_b)
Lo que resulta en:
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]
[1 1 1 1]
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 1. 1. 1. 1.]
[[ 4. 4. 4. 4.]
[ 4. 4. 4. 4.]
[ 4. 4. 4. 4.]]
[[ 4. 4. 4. 4. 1.]
[ 4. 4. 4. 4. 1.]
[ 4. 4. 4. 4. 1.]]
[[ 4. 4. 4.]
[ 4. 4. 4.]
[ 4. 4. 4.]
[ 4. 4. 4.]]
[[ 4. 4. 4.]
[ 4. 4. 4.]
[ 4. 4. 4.]
[ 4. 4. 4.]
[ 1. 1. 1.]]