problem z utworzeniem wykresu w Python

Odpowiedz Nowy wątek
2019-06-05 21:29
0

Cześć, mam pewien problem, próbuje utworzyć wykres w pythonie lecz ciągle wyrzuca mi błędem

can't multiply sequence by non-int of type 'float'

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import pandas as pd
np.set_printoptions(suppress=True)

data = pd.read_csv('countries_of_the_world.csv')
data = data.dropna()
f1 = data['Literacy (%)'].values
f2 = data['Arable (%)'].values
f5= data['Crops (%)'].values
"""
f3= data['Coastline (coast/area ratio)'].values
f4= data['Industry'].values
f5= data['Crops (%)'].values
f6= data['Pop. Density (per sq. mi.)'].values
f7= data['Population'].values
"""
for i in range(len(f1)):
    if "," in f1[i]:
        f1[i]=float(f1[i].replace(",","."))
for i in range(len(f2)):
    if "," in str(f2[i]):
        f2[i]=float(f2[i].replace(",","."))
for i in range(len(f5)):
    if "," in str(f5[i]):
        f5[i]=float(f5[i].replace(",","."))
f1=np.array(f1)
f2=np.array(f2)
f5=np.array(f5)
fig = plt.figure(figsize=(10,8))
ax = Axes3D(fig)
ax.scatter(f1, f2, f5)
plt.show()

Pozostało 580 znaków

2019-06-05 21:38
0

Rozumiem że nie łaska pokazać gdzie? Błąd mówi że robisz coś w stylu [1,2,3] * 1.1 a tak nie wolno bo nie miałoby to specjalnie sensu.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
Jak nie miałoby sensu? Przecież w matematyce jest jak najbardziej skalar * wektor :p - Dregorio 2019-06-05 21:43
w Pythonie też, ale do takich zabaw służy na przykład np.ndarray :P - superdurszlak 2019-06-05 21:49
Nie miałoby sensu, ponieważ list * int jest równoznaczne z list1 + list2 +...+ listN, gdzie N jest wartością int. Wykorzystanie wartości float w mnożeniu sekwencji, jaką jest list powoduje TypeError. Mnożenie macierzy/wektorów przez skalar (liczbę) odbywa się w Pythonie np. z wykorzystaniem wspomnianej numpy.ndarray. A lista bierze się stąd, że niepoprawnie konwertujesz wartości str do float, gdzie niektóre z nich przez Twój warunek if nie są konwertowane i później "rozumiane" właśnie jako listy. - Gjorni 2019-06-11 11:32
Chodziło mi z punktu widzenia matematyki. Nie konkretnego języka - Dregorio 2019-06-11 14:54
Shalom użył znacznika code dla oznaczenia działania, a nie LaTeXu, więc logiczniej było założyć, że chodzi raczej jednak o język programowania. Poza tym w matmie wykorzystujemy nawiasy okrągłe do pisania wektorów. - Gjorni 2019-06-11 15:31
Ja wiem o co chodziło Shalom. Mnie chodziło o matematykę, co powinienem był zaznaczyć - Dregorio 2019-06-11 16:11

Pozostało 580 znaków

2019-06-05 21:41
0

właśnie nie pokazuje w jakiej linijce jest błąd... Tylko wywala tym errorem i koniec

Pozostało 580 znaków

2019-06-05 21:43
0

Niemożliwe, Pokaż cały kod i cały Stack Trace.


Pozostało 580 znaków

2019-06-05 21:45
0

właśnie nie pokazuje w jakiej linijce jest błąd...

Musi, od tego jest stack trace. Inna sprawa, że powie Ci w którym momencie kod się wywalił, a nie, gdzie Ty walnąłeś pierwotnie babola.

Dopiero wczoraj albo przedwczoraj ktoś miał identyczny błąd i wszystko sprowadzało się do przecinka zamiast kropki w jakimś zahardkodowanym współczynniku, przez co zamiast ułamka delikwent dostawał tuple. Upewnij się, że nie robisz czegoś podobnego i zamiast liczby nie dostajesz listy, seta, tupla albo czegoś.

Robisz tam jakieś dziwaczne konwersje przecinków na kropki na stringach - takim dziwadłom bym się w pierwszej kolejności przyjrzał.


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)
edytowany 2x, ostatnio: superdurszlak, 2019-06-05 21:46

Pozostało 580 znaków

2019-06-05 21:46
0

screenshot-20190605214613.png

tutaj zrzut, a kod w całości to ten co wrzuciłem

Pozostało 580 znaków

2019-06-05 21:48
0

Tak w ogóle, to czemu robisz te dziwne konwersje zamiast po ludzku wykorzystać pandas.to_numeric i ew. jakieś opcje?


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)

Pozostało 580 znaków

2019-06-05 21:52
0

Czy to co jest na górze to jest proj3d.py? Gdzie jest linijka vecw = np.dot(M, vec)?


Pozostało 580 znaków

2019-06-05 21:55
1

A, no tak. Że też wcześniej nie zauważyliśmy - robisz konwersję str do float tylko, jeśli ten str zawiera przecinek. Zgadnij, co się stanie, jeśli jeden z nich będzie miał wartość "1234" i nie zostanie skonwertowany?

>>> x = "1234"
>>> x * 1.1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
>>>

Możesz podczas wczytywania pliku CSV dorzucić opcję decimal="," i pandas posprząta za Ciebie, oszczędzając Ci dziwacznych konwersji. to_numeric jednak się wywala i nie daje nawet jakichś dodatkowych opcji by określić decimal tam.


Prosząc o pomoc w wiadomości prywatnej odbierasz sobie szansę na otrzymanie pomocy od kogoś bardziej kompetentnego :)
edytowany 2x, ostatnio: superdurszlak, 2019-06-05 22:02

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0