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

Python tablice

0 głosów
410 wizyt
pytanie zadane 4 grudnia 2019 w Python przez Nortalf Użytkownik (790 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 (300,440 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 (790 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 (790 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 (300,440 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 (790 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
1 odpowiedź 296 wizyt
pytanie zadane 12 maja 2020 w Python przez PgK Obywatel (1,380 p.)
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 11 maja 2018 w Python przez michal51995 Początkujący (380 p.)
0 głosów
1 odpowiedź 70 wizyt
pytanie zadane 10 kwietnia w Python przez T100 Obywatel (1,340 p.)
Porady nie od parady
Zadając pytanie postaraj się o poprawną pisownię i czytelne formatowanie tekstu.Kompozycja

85,212 zapytań

134,029 odpowiedzi

297,158 komentarzy

56,309 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...