• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python tablice

VPS Starter Arubacloud
0 głosów
757 wizyt
pytanie zadane 4 grudnia 2019 w Python przez Nortalf Użytkownik (880 p.)

Cześć.
Dopiero od dwóch dni piszę w pythonie. Mam problem z biblioteką matplotlib do tworzenia wykresów. 
Używając list jako argumentów x,y,z dla funkcji rysującej wykres punktowy, wykres rysuje się poprawnie. Niestety nie mogę narysować wykresu wireframe ani innych ponieważ lista nie ma atrybutu ndim a taki jest warunek w funkcji rysującej (warunek bez sensu bo print(pn.ndin(z) gdzie z to lista wypisuje jeden ale to nie jest atrybut więc nie zadziała).

Tablice mają ndim i mógłbym ich użyć ale tu pojawia się chaos informacyjny. Jedni piszą, że tablice to to samo co listy (co jest bzdurą) itd. Tutaj wkleję mój kod żeby pokazać o co chodzi.

 

from mpl_toolkits.mplot3d import axes3d
from matplotlib import pyplot as plt
import numpy as np
from numpy import array

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

#x, y, z, = axes3d.get_test_data(0.05)
'''x = [1,2,3,4,5,6,7,8]
y = [1,2,3,4,5,6,7,8]
z = [3,4,5,6,7,7,7,8]'''

a = [0,10,20,30,40,50,60,70,80,90]
b = [0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360]
r = [301,301,300,299,297,298,296,294,294,291,293,292,292,290,291,288,287,286,288,289,288,288,288,290,289,291,294,294,295,297,297,299,300,301,299,298,299,
297,297,297,296,299,298,299,297,298,296,291,291,289,289,285,285,278,279,280,283,281,278,283,284,282,283,286,287,291,289,288,290,294,296,297,296,294,
291,292,289,289,296,298,295,293,287,279,281,279,276,281,283,277,273,278,274,278,279,286,286,281,283,280,272,271,281,290,287,292,295,297,290,285,286,
296,299,295,291,296,297,295,284,278,279,286,280,276,273,265,265,263,271,280,274,267,268,270,280,278,276,276,277,280,288,306,306,306,309,303,304,307,
314,308,306,296,299,302,292,290,287,282,281,278,275,272,275,276,280,279,277,276,273,271,271,271,278,271,278,290,292,294,294,302,299,303,307,307,313,
292,287,291,289,279,275,280,280,281,272,258,253,258,253,250,267,260,262,267,266,258,255,246,247,249,248,255,266,274,277,284,286,280,292,295,294,296,
290,278,276,271,259,263,266,256,261,258,244,236,240,232,229,246,246,252,254,241,240,237,228,236,235,242,256,258,258,265,276,284,281,288,291,287,291,
259,249,251,250,239,246,244,239,241,239,237,233,237,230,227,244,247,250,247,238,222,211,207,216,222,220,228,239,238,242,257,262,253,269,268,269,268,
246,231,240,235,217,200,208,219,232,243,237,245,250,247,241,270,278,285,283,261,249,229,207,192,197,202,199,203,199,209,222,230,232,244,243,250,255,
242,230,218,213,210,220,217,210,219,220,214,221,231,244,249,248,270,280,280,265,250,248,245,252,242,228,226,234,235,234,247,244,231,242,243,244,246]
i=0
j=0
k=0
x=[]
y=[]
z=array([])
for j in range(0, 10):      #licznik dla a
    for k in range(0,37):   #licznik dla b
    #while a[i]!=0:
        xa=r[i]*np.sin(b[k]*10)*np.cos(a[j]*10)
        #x[i]=xa
        x.append(xa)
        ya=r[i]*np.sin(a[j]*10)*np.sin(b[k]*10)
        #y[i]=ya
        y.append(ya)
        za=r[i]*np.cos(b[k]*10)
        #z[i]=za
        z.append(za)
        i+=1


#ax.plot_wireframe(x,y,z, rstride=10, cstride=10)
#print(i)
#ax.scatter(x,y,z)
print(np.ndim(z))
ax.plot_surface(x,y,z)
plt.show()
         
         

W pętli mam użyte z.append(za) i pomimo, że niektórzy piszą że tablice obsługują append to 
 

from numpy import array

z=array([])

z.append(za)

daje

natomiast 
 

import array
z=array.array([])
 z.append(za)

Pyania:
-Czy mogę przy deklaracji tablicy podać ilość jej elementów, żeby pominąć rozszerzanie jej poprzez append?
-Czy tablicę można rozszerzać poprzez append?

 

1 odpowiedź

0 głosów
odpowiedź 4 grudnia 2019 przez adrian17 Ekspert (344,100 p.)
Po kolei:

- tutaj w ogóle nie chodzi o moduł `array` z biblioteki standardowej, proponuję na razie o nim zapomnieć.

- wygląda na to, że plot_surface() zakłada że argumenty są 2-wymiarowymi numpy'owymi tablicami - dlatego szuka pola .ndim.

Tu jest praktyczny przykład: https://matplotlib.org/3.1.0/gallery/mplot3d/surface3d.html

(można też do samego końca operować na Pythonowych listach i na samym końcu zamienić je na numpy'owe tablice)
komentarz 4 grudnia 2019 przez Nortalf Użytkownik (880 p.)

Możesz mi pomóc zrozumieć dokładnie ten kod?
I co oznaczają nump'owe tablice?

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)


X, Y = np.meshgrid(X, Y) To jest mój problem, nie rozumiem sensu tej operacji.
Tworzy z X i Y kilkuwymiarowe tablice, ale jak i po co?

Wypisałem sobie te tablice:

W X wszystkie linie są takie same, a w Y każda linia zawiera jeden, powtarzający się element. Po co? I jak na podstawie tego on rysuje wykres?
Poza tym w tym przykładzie Z jest pierwiastkiem sumy potęg tych tablic dzięki czemu jest dwuwymiarowy. Ja nie mogę go stworzyć w ten sposób.

 

komentarz 4 grudnia 2019 przez Nortalf Użytkownik (880 p.)

Próbowałem użyć np.meshgrid na moim z, bo wygląda na to tylko z jest wymagany jako dwuwymiarowy. 
 

z=np.meshgrid(z)
print(np.ndim(z))
ax.plot_surface(x,y,z)
plt.show()

Wyświetla print(np.ndim(z)) wyświetla 2 ale dalej nie ma atrybutu ndim 

komentarz 4 grudnia 2019 przez adrian17 Ekspert (344,100 p.)

Jak mówiłem - te funkcje zakładają, że wszystkie trzy argumenty są numpy'owymi tablicami. Tutaj któraś z nich nie jest.

Tworzy z X i Y kilkuwymiarowe tablice, ale jak i po co?

To jest wtedy pełna siatka XY. Zamiast mieć listę koordynatów (x, y) to jest rozdzielona na macierz koordynatów X i macierz koordynatów Y.

Mógłbym pomóc i pomóc jak Twój do tego poprawić, ale... tak szczerze to zupełnie nie rozumiem co tam liczysz.

komentarz 4 grudnia 2019 przez Nortalf Użytkownik (880 p.)

Mój przyjaciel na swoje studia zbudował urządzenie do testowania żarówek samochodowych czy coś w ten deseń. Ważne jest to, ze ono obraca się dookoła i zbiera dane które trzeba przedstawić w formie trójwymiarowego grafu. 
 

a = [0,10,20,30,40,50,60,70,80,90]
b =[0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360]
r = [301,301,300................246]
i=0
j=0
k=0
x=[]
y=[]
z=[]

Tylko, że pomiar jest w układzie współrzędnych sferycznych. W moim kodzie a i b to kąty, r to jest promień czyli wynik pomiaru.

Według tych matematycznych wzorów obliczam współrzędne kartezjańskie i dopisuje je do listy:
 

        xa=r[i]*np.sin(b[k]*10)*np.cos(a[j]*10)
        x.append(xa)
        ya=r[i]*np.sin(a[j]*10)*np.sin(b[k]*10)
        y.append(ya)
        za=r[i]*np.cos(b[k]*10)
        z.append(za)

Ten kod jest w dwóch forach po to, żeby dla każdego kąta a i b przypisać wartość.
I to wszystko. Jest jeszcze wypisanie tego:

ax.scatter(x,y,z)
plt.show()


I to działa, ale dla  wykresu punktowego, ax.scatter(x,y,z)
Chodzi o to, że to powinna być bryła 3D a nie same punkty. 
Później jeszcze zajmę się tym, żeby wartość r była zaczytywana z pliku, bo na razie jest wpisana ręcznie, ale najpierw zajmuję się tym.

Cały kod wygląda tak:
 

from mpl_toolkits.mplot3d import axes3d
from matplotlib import pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')


a = [0,10,20,30,40,50,60,70,80,90]
b = [0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,360]
r = [301,301,300,299,297,298,296,294,294,291,293,292,292,290,291,288,287,286,288,289,288,288,288,290,289,291,294,294,295,297,297,299,300,301,299,298,299,
297,297,297,296,299,298,299,297,298,296,291,291,289,289,285,285,278,279,280,283,281,278,283,284,282,283,286,287,291,289,288,290,294,296,297,296,294,
291,292,289,289,296,298,295,293,287,279,281,279,276,281,283,277,273,278,274,278,279,286,286,281,283,280,272,271,281,290,287,292,295,297,290,285,286,
296,299,295,291,296,297,295,284,278,279,286,280,276,273,265,265,263,271,280,274,267,268,270,280,278,276,276,277,280,288,306,306,306,309,303,304,307,
314,308,306,296,299,302,292,290,287,282,281,278,275,272,275,276,280,279,277,276,273,271,271,271,278,271,278,290,292,294,294,302,299,303,307,307,313,
292,287,291,289,279,275,280,280,281,272,258,253,258,253,250,267,260,262,267,266,258,255,246,247,249,248,255,266,274,277,284,286,280,292,295,294,296,
290,278,276,271,259,263,266,256,261,258,244,236,240,232,229,246,246,252,254,241,240,237,228,236,235,242,256,258,258,265,276,284,281,288,291,287,291,
259,249,251,250,239,246,244,239,241,239,237,233,237,230,227,244,247,250,247,238,222,211,207,216,222,220,228,239,238,242,257,262,253,269,268,269,268,
246,231,240,235,217,200,208,219,232,243,237,245,250,247,241,270,278,285,283,261,249,229,207,192,197,202,199,203,199,209,222,230,232,244,243,250,255,
242,230,218,213,210,220,217,210,219,220,214,221,231,244,249,248,270,280,280,265,250,248,245,252,242,228,226,234,235,234,247,244,231,242,243,244,246]
i=0
j=0
k=0
x=[]
y=[]
z=[]








for j in range(0, 10):      #licznik dla a
    for k in range(0,37):   #licznik dla b
        xa=r[i]*np.sin(b[k]*10)*np.cos(a[j]*10)
        x.append(xa)
        ya=r[i]*np.sin(a[j]*10)*np.sin(b[k]*10)
        y.append(ya)
        za=r[i]*np.cos(b[k]*10)
        z.append(za)
        i+=1


#ax.plot_wireframe(x,y,z, rstride=10, cstride=10)
ax.scatter(x,y,z)
#ax.plot_surface(x, y, z)
plt.show()
         
         

 

Podobne pytania

0 głosów
0 odpowiedzi 298 wizyt
0 głosów
1 odpowiedź 1,092 wizyt
pytanie zadane 12 maja 2020 w Python przez PgK Obywatel (1,380 p.)
0 głosów
1 odpowiedź 216 wizyt
pytanie zadane 11 maja 2018 w Python przez michal51995 Początkujący (380 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...