wake-up-neo.net

Verketten von zwei eindimensionalen NumPy-Arrays

Ich habe zwei einfache eindimensionale Arrays in NumPy . Ich sollte in der Lage sein, sie mit numpy.concatenate zu verketten. Aber ich bekomme diesen Fehler für den folgenden Code:

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

Code

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

Warum?

219
highBandWidth

Die Linie sollte sein:

numpy.concatenate([a,b])

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

Aus der NumPy-Dokumentation :

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

Verbinden Sie eine Sequenz von Arrays miteinander.

Es wurde versucht, Ihr b als Achsenparameter zu interpretieren, weshalb es sich beschwerte, dass es nicht in einen Skalar konvertiert werden konnte.

306
Winston Ewert

Der erste Parameter für concatenate sollte selbst ein Folge von Arrays sein, um Folgendes zu verketten:

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

Es gibt verschiedene Möglichkeiten zum Verketten von 1D-Arrays, z.

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

Alle diese Optionen sind für große Arrays gleich schnell. für kleine hat concatenate eine leichte Kante:

enter image description here

Der Plot wurde erstellt mit perfplot :

import numpy
import perfplot

perfplot.save(
    "o.png",
    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,
    )
20
Nico Schlömer

Eine Alternative ist die Verwendung der Kurzform "verketten", die entweder "r _ [...]" oder "c _ [...]" ist, wie im folgenden Beispielcode 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)

Was in ... endet:

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

Hier sind weitere Ansätze, um dies zu tun, indem Sie numpy.ravel() , numpy.array() unter Ausnutzung der Tatsache, dass 1D-Arrays in einfache Elemente entpackt werden können:

# we'll utilize the concept of unpacking
In [15]: (*a, *b)
Out[15]: (1, 2, 3, 5, 6)

# using `numpy.ravel()`
In [14]: np.ravel((*a, *b))
Out[14]: array([1, 2, 3, 5, 6])

# wrap the unpacked elements in `numpy.array()`
In [16]: np.array((*a, *b))
Out[16]: array([1, 2, 3, 5, 6])
0
kmario23