Co stanowi różnicę między tablicą z kształtu (N, 1) i jednym z kształtów (N)? I jak konwertować między tymi dwoma?

głosy
2

Python początkujących tutaj przychodzi z pomocą MATLAB tle.

Mam tablicy 1 kolumny i chce się przenieść tę kolumnę w pierwszej kolumnie tablicy 3 kolumny. Z MATLAB tle jest to, co chciałbym zrobić:

import numpy as np

A = np.zeros([150,3]) #three column array

B = np.ones([150,1]) #one column array which needs to replace the first column of A

#MATLAB-style solution:

A[:,0] = B

Jednak to nie działa, ponieważ „kształt” A jest (150,3) i „kształt” B jest (150,1). I najwyraźniej to polecenie [:, 0] skutkuje „kształtem litery W” (150).

Teraz, co jest różnica między (150,1) i (150)? Nie są one tak samo: wektor kolumnowy? I dlaczego nie jest Python „wystarczająco inteligentny”, aby dowiedzieć się, że chcę umieścić wektor kolumnowy, B, w pierwszej kolumnie?

Czy istnieje prosty sposób przekonwertować wektor 1-kolumny z kształtem (n, 1) do wektora 1-kolumnowej z kształtu (N)?

Jestem nowym Python i wydaje się to naprawdę głupie rzeczy, że MATLAB robi o wiele lepiej ...

Utwórz 13/11/2017 o 23:36
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
2

Użyciu ściskanego sposób wyeliminować wymiary wielkości 1.

A[:,0] = B.squeeze()

Albo po prostu stworzyć B jednowymiarowy zacząć:

B = np.ones([150])

Fakt, że NumPy utrzymuje różnicę pomiędzy tablicy 1D i 2D, z jednej matrycy o wymiarach wynosi 1 jest uzasadnione, zwłaszcza gdy zaczyna się na macierzy n-wymiarowej.

Aby odpowiedzieć na pytanie, w tytule: istnieje wyraźna różnica konstrukcyjna między tablicą kształtu (3,), takiego jak

[1, 2, 3]

oraz szereg postaci (3, 1), takie jak

[[1], [2], [3]]
Odpowiedział 14/11/2017 o 00:01
źródło użytkownik

głosy
3

Kilka rzeczy są różne. W numpytablicach mogą być 0d lub 1d lub wyższej. MATLAB 2d jest najmniejsza (oraz w tym samym czasie tylko wymiary). MATLAB łatwo rozszerza Wymiary koniec, ponieważ jest Fortran ordered. numpyJest domyślnie c ordered, a najłatwiej rozszerza wymiary na froncie.

In [1]: A = np.zeros([5,3])
In [2]: A[:,0].shape   
Out[2]: (5,)

Proste indeksowanie zmniejsza wymiar, niezależnie czy jest to A[0,:]albo A[:,0]. Natomiast, że w stanie do 3d matrycy MATLAB A(1,:,:)V A(:,:,1).

numpynie broadcasting, podczas operacji regulacji wymiarów, jak suma i przyporządkowanie. Jedną podstawową zasadą jest to, że wymiary mogą być automatycznie rozszerzone w kierunku startu w razie potrzeby:

In [3]: A[:,0] = np.ones(5)
In [4]: A[:,0] = np.ones([1,5])
In [5]: A[:,0] = np.ones([5,1])
...
ValueError: could not broadcast input array from shape (5,1) into shape (5)

Może on zmienić (5,)LHS do (1,5), ale nie może go zmienić na (5,1).

Innym przykładem nadawania, +:

In [6]: A[:,0] + np.ones(5);
In [7]: A[:,0] + np.ones([1,5]);
In [8]: A[:,0] + np.ones([5,1]);

Teraz (5) współpracuje z (5,1), a to dlatego, że się (1,5), które wraz z (5,1) daje (5,5) - jest nadawanie produktów zewnętrzna:

In [9]: (A[:,0] + np.ones([5,1])).shape
Out[9]: (5, 5)

w oktawie

>> x = ones(2,3,4);
>> size(x(1,:,:))
ans =
   1   3   4
>> size(x(:,:,1))
ans =
   2   3
>> size(x(:,1,1) )
ans =
   2   1
>> size(x(1,1,:) )
ans =
   1   1   4

Aby wykonać zadanie, które chcesz dostosować obu stronach

Indeks w sposób, który zachowuje liczbę wymiarów:

In [11]: A[:,[0]].shape    
Out[11]: (5, 1)
In [12]: A[:,[0]] = np.ones([5,1])

transpozycji przycisk (5,1) do (1,5)

In [13]: A[:,0] = np.ones([5,1]).T

spłaszczenia / wystrzępionych się (5,1) do (5):

In [14]: A[:,0] = np.ones([5,1]).flat
In [15]: A[:,0] = np.ones([5,1])[:,0]

squeeze, ravelRównież działa.

Kilka szybkich testów w oktawie wskazują, że jest bardziej wyrozumiały, jeśli chodzi o wymiary niedopasowania. Ale numpypriorytet konsystencję. Gdy zasady nadawania rozumie zachowanie ma sens.

Odpowiedział 14/11/2017 o 02:21
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more