410 Stimmen

Verkettung von zwei eindimensionalen NumPy-Arrays

Wie verkette ich zwei eindimensionale Arrays in NumPy ? Ich habe versucht numpy.concatenate :

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5])
np.concatenate(a, b)

Aber ich erhalte eine Fehlermeldung:

TypeError: nur Arrays der Länge 1 können in Python-Skalare umgewandelt werden

543voto

Winston Ewert Punkte 42219

Úsalo:

np.concatenate([a, b])

Die Arrays, die Sie verketten wollen, müssen als Sequenz übergeben werden, nicht als separate Argumente.

Desde el NumPy-Dokumentation :

numpy.concatenate((a1, a2, ...), axis=0)

Verbindet eine Folge von Arrays miteinander.

Es hat versucht, Ihre Daten zu interpretieren. b als Achsenparameter, weshalb es sich beschwerte, dass es nicht in einen Skalar umgewandelt werden konnte.

83voto

Nico Schlömer Punkte 45358

Es gibt verschiedene Möglichkeiten der Verkettung von 1D-Arrays, z. B,

import numpy as np

np.r_[a, a]
np.stack([a, a]).reshape(-1)
np.hstack([a, a])
np.concatenate([a, a])

Alle diese Optionen sind für große Arrays gleich schnell, für kleine Arrays nicht, concatenate hat einen leichten Vorsprung:

enter image description here

Der Plot wurde erstellt mit 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)",
)

39voto

Gabe Punkte 82268

Der erste Parameter von concatenate sollte selbst ein Folge von Arrays zu verketten:

numpy.concatenate((a,b)) # Note the extra parentheses.

14voto

Semjon Mössinger Punkte 1626

Eine Alternative ist die Verwendung der Kurzform von "concatenate", die entweder "r_[...]" oder "c_[...]" lautet, wie im Beispielcode unten gezeigt (siehe http://wiki.scipy.org/NumPy_for_Matlab_Users für zusätzliche Informationen):

%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)

Daraus ergibt sich:

[ 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.]]

4voto

Pe Dro Punkte 1769

Einige weitere Fakten aus dem Numpy docs :

Mit der Syntax als numpy.concatenate((a1, a2, ...), axis=0, out=None)

Achse = 0 bei zeilenweiser Verkettung Achse = 1 bei spaltenweiser Verkettung

>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])

# Appending below last row
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])

# Appending after last column
>>> np.concatenate((a, b.T), axis=1)    # Notice the transpose
array([[1, 2, 5],
       [3, 4, 6]])

# Flattening the final array
>>> np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

Ich hoffe, es hilft!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X