ValueError: alle invoerarrays moeten hetzelfde aantal dimensies hebben

Ik heb een probleem met np.append.

Ik probeer de laatste kolom van 20×361 matrix n_list_convertedte dupliceren met de onderstaande code:

n_last = []
n_last = n_list_converted[:, -1]
n_lists = np.append(n_list_converted, n_last, axis=1)

Maar ik krijg foutmelding:

ValueError: alle invoerarrays moeten hetzelfde aantal dimensies hebben

Ik heb de matrixafmetingen echter gecontroleerd door te doen

print(n_last.shape, type(n_last), n_list_converted.shape, type(n_list_converted))

en ik krijg

(20L,) (20L, 361L)

dus de afmetingen komen overeen? Waar zit de fout?


Antwoord 1, autoriteit 100%

Als ik begin met een 3×4 array en een 3×1 array samenvoeg met as 1, krijg ik een 3×5 array:

In [911]: x = np.arange(12).reshape(3,4)
In [912]: np.concatenate([x,x[:,-1:]], axis=1)
Out[912]: 
array([[ 0,  1,  2,  3,  3],
       [ 4,  5,  6,  7,  7],
       [ 8,  9, 10, 11, 11]])
In [913]: x.shape,x[:,-1:].shape
Out[913]: ((3, 4), (3, 1))

Houd er rekening mee dat beide ingangen om samen te voegen 2 dimensies hebben.

Laat de :weg, en x[:,-1]is (3,) vorm – het is 1d, en vandaar de fout:

In [914]: np.concatenate([x,x[:,-1]], axis=1)
...
ValueError: all the input arrays must have same number of dimensions

De code voor np.appendis (in dit geval waar de as is gespecificeerd)

return concatenate((arr, values), axis=axis)

Dus met een kleine wijziging van de syntaxis werkt append. In plaats van een lijst zijn er 2 argumenten nodig. Het imiteert de syntaxis van de lijst append, maar moet niet worden verward met die lijstmethode.

In [916]: np.append(x, x[:,-1:], axis=1)
Out[916]: 
array([[ 0,  1,  2,  3,  3],
       [ 4,  5,  6,  7,  7],
       [ 8,  9, 10, 11, 11]])

np.hstackzorgt er eerst voor dat alle invoer atleast_1dis, en voegt dan samen:

return np.concatenate([np.atleast_1d(a) for a in arrs], 1)

Het vereist dus dezelfde x[:,-1:]invoer. In wezen dezelfde actie.

np.column_stackdoet ook een aaneenschakeling op as 1. Maar eerst geeft het 1d-invoer door

array(arr, copy=False, subok=True, ndmin=2).T

Dit is een algemene manier om van die (3,) array een (3,1) array te maken.

In [922]: np.array(x[:,-1], copy=False, subok=True, ndmin=2).T
Out[922]: 
array([[ 3],
       [ 7],
       [11]])
In [923]: np.column_stack([x,x[:,-1]])
Out[923]: 
array([[ 0,  1,  2,  3,  3],
       [ 4,  5,  6,  7,  7],
       [ 8,  9, 10, 11, 11]])

Al deze ‘stapels’ kunnen handig zijn, maar op de lange termijn is het belangrijk om dimensies en de basis np.concatenatete begrijpen. Weet ook hoe je de code voor dit soort functies kunt opzoeken. Ik gebruik de ipython??magie veel.

en in time-tests, de np.concatenateis merkbaar sneller – met een kleine array zoals deze maakt de extra lagen van functie-oproepen een groot tijdsverschil.


Antwoord 2, Autoriteit 63%

(n,) en (n, 1) zijn niet dezelfde vorm. Probeer de vector naar een array te gieten met behulp van de [:, None]notatie:

n_lists = np.append(n_list_converted, n_last[:, None], axis=1)

Als alternatief, bij het extraheren van n_lastU kunt

gebruiken

n_last = n_list_converted[:, -1:]

om een ​​(20, 1)array te krijgen.


Antwoord 3, Autoriteit 37%

De reden waarom u uw fout krijgt, is omdat een matrix “1 door n” anders is dan een reeks lengte n.

Ik raad aan hstack()en vstack()in plaats daarvan toe.
Zoals dit:

import numpy as np
a = np.arange(32).reshape(4,8) # 4 rows 8 columns matrix.
b = a[:,-1:]                    # last column of that matrix.
result = np.hstack((a,b))       # stack them horizontally like this:
#array([[ 0,  1,  2,  3,  4,  5,  6,  7,  7],
#       [ 8,  9, 10, 11, 12, 13, 14, 15, 15],
#       [16, 17, 18, 19, 20, 21, 22, 23, 23],
#       [24, 25, 26, 27, 28, 29, 30, 31, 31]])

Let op de herhaalde kolom “7, 15, 23, 31”.
Merk ook op dat ik a[:,-1:]gebruikte in plaats van a[:,-1]. Mijn versie genereert een kolom:

array([[7],
       [15],
       [23],
       [31]])

in plaats van een rij array([7,15,23,31])


Bewerken: append()is veellangzamer. Lees dit antwoord.


Antwoord 4, autoriteit 16%

U kunt ook (n,) naar (n,1) casten door tussen haakjes [ ] te plaatsen.

bijv. Gebruik in plaats van np.append(b,a,axis=0)np.append(b,[a],axis=0)

a=[1,2]
b=[[5,6],[7,8]]
np.append(b,[a],axis=0)

retouren

array([[5, 6],
       [7, 8],
       [1, 2]])

Other episodes