Permalänk
Medlem

@bardbard: Ojdå, råkade viss kopiera för mycket av föregående skriven kod utan att faktiskt kolla resultatet. Detta fungerar nog bättre

primes = [2] def check_prime(n): if n in primes: return True else: for i in range(2, n): if n % i == 0: return False primes.append(n) return True for x in range(2, 50): test = check_prime(x) print x, test print(primes)

Visa signatur

Skoj: Ryzen 9 5900x, RTX 3080, 32 GB RAM @3200MHz CL16
Jobb: Alienware M15 R6, RTX 3080, 32 GB RAM
Privat: Macbook Pro 13" late 2016

Permalänk
Medlem
Skrivet av bardbard:

Flytta ut 'primes'-listan utanför funktionen så den blir global så ska du se att det går bättre:

primes = [2] def check_prime(n): # anledningen till att denna är satt som "2" och inte som tom lista, är att 2 är det enda primtal som funktionen inte kan räkna ut pga "for i in range(2, n):" ....print(primes) # denna är där för att se om "primes" ändrats genom att printa listan, skall tas bort då allt fungerar ....if n in primes: ........return True ....else: ........for i in range(2, n): ............if n % i == 0: ................return False ............else: ................primes.append(n) # här skall den lägga till (n) ifall det är ett primtal i "primes" ................return True test = check_prime(13) print(test) # denna är är för att testa om funktionen fungerar eller ej.

Dold text
Skrivet av mmolder:

@stenharl: Exakt som ovanstående skriver så kan det enkelt lösas genom att flytta din lista för primtal utanför funktionen vilket gör den global. Följande kod testar alla tal mellan 2 och 50 för primtal och skriver till slut ut listan. Går så klart att modifiera så att det fungerar som du vill. Exempelvis genom att be om ett tal i taget som i sin tur testas.

primes = [2] def check_prime(n): if n in primes: return True else: for i in range(2, n): if n % i == 0: return False else: primes.append(n) return True for x in range(2, 50): test = check_prime(x) print x, test print(primes)

Dold text
Skrivet av bardbard:

Sedan har du fortfarande fel i din beräkning då den kommer att returnera tal som inte är primtal.
Om man kör programmet ovan får man att dessa är primtal:

[2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49]

Där de fetade talen är felaktiga.
Rätt rad ska vara:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

Tack för eran hjälp! Angående felet i koden, så kunde jag svära på att det fungerade innan jag lade till listan? Men men, får knåpa vidare och se om jag kan komma på någon lösning att presentera resultatet på, för det fungerar uppenbarligen inte som jag tänkt nu.

Men åter en gång tack för hjälpen

Visa signatur

Dator: | i5 6600K @ 4,4GHz | Be-Quiet Pure Rock | Palit GeForce GTX 1060 Dual | Corsair Vengeance LPX Black DDR4 2133MHz 2x8GB | Gigabyte GA-Z170-Gaming K3 | Fractal Design Define S | Kingston 240GB | Corsair RM550X 550W |

Skärmar: | Asus VG248QE@144Hz | Samsung S24D340H@60Hz

Permalänk
Medlem
Skrivet av mmolder:

@bardbard: Ojdå, råkade viss kopiera för mycket av föregående skriven kod utan att faktiskt kolla resultatet. Detta fungerar nog bättre

primes = [2] def check_prime(n): if n in primes: return True else: for i in range(2, n): if n % i == 0: return False primes.append(n) return True for x in range(2, 50): test = check_prime(x) print x, test print(primes)

okej, jag måste kolla skillnaden på dessa två lite djupare

Edit:

Ok, kan någon kunnig förklara varför den övre koden (i spoilern) fungerar som den ska, men inte den undre? Det är bara ett "else" statement annorlunda.

primes = [2] def check_prime(n): if n in primes: return True else: for i in range(2, n): if n % i == 0: return False primes.append(n) return True for x in range(2, 50): test = check_prime(x) print(x, test) print(primes)

primes = [2] def check_prime(n): if n in primes: return True else: for i in range(2, n): if n % i == 0: return False else: <----------------------Detta är den enda skillnaden primes.append(n) return True for x in range(2, 50): test = check_prime(x) print(primes)

Dold text
Visa signatur

Dator: | i5 6600K @ 4,4GHz | Be-Quiet Pure Rock | Palit GeForce GTX 1060 Dual | Corsair Vengeance LPX Black DDR4 2133MHz 2x8GB | Gigabyte GA-Z170-Gaming K3 | Fractal Design Define S | Kingston 240GB | Corsair RM550X 550W |

Skärmar: | Asus VG248QE@144Hz | Samsung S24D340H@60Hz

Permalänk
Medlem

@stenharl: Ursäkta sent svar. Den undre fungerar helt enkelt inte för att den direkt efter att testat talet du vill kontrollera om det är primtal och if satsen inte uppfylls kommer else markera det som primtal.

Ta ett exempel med nästan vilket ojämnt icke-primtal som helst, tex 9. Du kontrollerar först om 9 % 2 = 0 vilket det inte är. Därefter, istället för att kontrollera 9 % 3 (vilket i detta fall är noll) så kommer du gå in i else och markera 9 som primtal, vilket är felaktigt.

Därför så, i den övre koden, så testar man alla tal från 2 till n (där n är talet du kontrollerar om prim) och endast om ingen uppfyller if satsen, markerar det som primtal (kom ihåg vad som definierar ett primtal).

Hoppas det förklarar

Visa signatur

Skoj: Ryzen 9 5900x, RTX 3080, 32 GB RAM @3200MHz CL16
Jobb: Alienware M15 R6, RTX 3080, 32 GB RAM
Privat: Macbook Pro 13" late 2016

Permalänk
Medlem
Skrivet av mmolder:

@stenharl: Ursäkta sent svar. Den undre fungerar helt enkelt inte för att den direkt efter att testat talet du vill kontrollera om det är primtal och if satsen inte uppfylls kommer else markera det som primtal.

Ta ett exempel med nästan vilket ojämnt icke-primtal som helst, tex 9. Du kontrollerar först om 9 % 2 = 0 vilket det inte är. Därefter, istället för att kontrollera 9 % 3 (vilket i detta fall är noll) så kommer du gå in i else och markera 9 som primtal, vilket är felaktigt.

Därför så, i den övre koden, så testar man alla tal från 2 till n (där n är talet du kontrollerar om prim) och endast om ingen uppfyller if satsen, markerar det som primtal (kom ihåg vad som definierar ett primtal).

Hoppas det förklarar

Solklart, tack för svaret!

Visa signatur

Dator: | i5 6600K @ 4,4GHz | Be-Quiet Pure Rock | Palit GeForce GTX 1060 Dual | Corsair Vengeance LPX Black DDR4 2133MHz 2x8GB | Gigabyte GA-Z170-Gaming K3 | Fractal Design Define S | Kingston 240GB | Corsair RM550X 550W |

Skärmar: | Asus VG248QE@144Hz | Samsung S24D340H@60Hz

Permalänk
Medlem

Hej igen, nu har jag kört fast i subsetings av 2d arrays.

Låt oss säga att jag har arrayen;

np_y =np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])

Skiver jag np_y[2]

så får jag:

array([5, 6])

som väntat. men skriver jag

np_y[2:]

så får jag:

array([[ 5, 6], [ 7, 8], [ 9, 10]])

eller skiver jag:

np_y[1:1, 0]

som i mitt huvud borde bli

array([3])

men istället blir:

array([], dtype=int32)

Jag är helt bort blåst av detta skulle någon vänlig själ kunna förklara detta för mig?

Visa signatur

Dator: | i5 6600K @ 4,4GHz | Be-Quiet Pure Rock | Palit GeForce GTX 1060 Dual | Corsair Vengeance LPX Black DDR4 2133MHz 2x8GB | Gigabyte GA-Z170-Gaming K3 | Fractal Design Define S | Kingston 240GB | Corsair RM550X 550W |

Skärmar: | Asus VG248QE@144Hz | Samsung S24D340H@60Hz

Permalänk
Datavetare
Skrivet av stenharl:

Hej igen, nu har jag kört fast i subsetings av 2d arrays.

Låt oss säga att jag har arrayen;

np_y =np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])

Skiver jag np_y[2]

så får jag:

array([5, 6])

som väntat. men skriver jag

np_y[2:]

så får jag:

array([[ 5, 6], [ 7, 8], [ 9, 10]])

eller skiver jag:

np_y[1:1, 0]

som i mitt huvud borde bli

array([3])

men istället blir:

array([], dtype=int32)

Jag är helt bort blåst av detta skulle någon vänlig själ kunna förklara detta för mig?

Detta

np_y[1:1, 0]

säger att du vill ha första kolumnen (andra index som är 0) i den uppsättning rader som börjar med rad 1 (inkluderar rad med index 1) och slutar med rad 1 (men detta är exklusive det index man listar).

Så du får tillbaka noll rader, men NumPy vet ändå att du gjorde den uppslagningen i en matris 5x2 format och det du får tillbaka säger att vad du frågade efter resulterade i noll element i en matris som innehåller element av typen int32.

Du ville nog skriva detta

np_y[1:2, 0]

vilket ger

array([3])

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Detta

np_y[1:1, 0]

säger att du vill ha första kolumnen (andra index som är 0) i den uppsättning rader som börjar med rad 1 (inkluderar rad med index 1) och slutar med rad 1 (men detta är exklusive det index man listar).

Så du får tillbaka noll rader, men NumPy vet ändå att du gjorde den uppslagningen i en matris 5x2 format och det du får tillbaka säger att vad du frågade efter resulterade i noll element i en matris som innehåller element av typen int32.

Du ville nog skriva detta

np_y[1:2, 0]

vilket ger

array([3])

Jag tror att jag förstår, men hur förklaras?

np_y[2:]

så får jag:

array([[ 5, 6], [ 7, 8], [ 9, 10]])

Visa signatur

Dator: | i5 6600K @ 4,4GHz | Be-Quiet Pure Rock | Palit GeForce GTX 1060 Dual | Corsair Vengeance LPX Black DDR4 2133MHz 2x8GB | Gigabyte GA-Z170-Gaming K3 | Fractal Design Define S | Kingston 240GB | Corsair RM550X 550W |

Skärmar: | Asus VG248QE@144Hz | Samsung S24D340H@60Hz

Permalänk
Medlem
Skrivet av stenharl:

Jag tror att jag förstår, men hur förklaras?

np_y[2:]

så får jag:

array([[ 5, 6], [ 7, 8], [ 9, 10]])

När du använder slice-notationen och bara anger start men inte stopp så blir det från det angivna start-indexet till slutet. Dvs från index 2 (tredje elementet) till slutet.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

När du använder slice-notationen och bara anger start men inte stopp så blir det från det angivna start-indexet till slutet. Dvs från index 2 (tredje elementet) till slutet.

Tack för den! Ska sitta och experimentera mer i veckan, återkommer om jag kör fast igen

Visa signatur

Dator: | i5 6600K @ 4,4GHz | Be-Quiet Pure Rock | Palit GeForce GTX 1060 Dual | Corsair Vengeance LPX Black DDR4 2133MHz 2x8GB | Gigabyte GA-Z170-Gaming K3 | Fractal Design Define S | Kingston 240GB | Corsair RM550X 550W |

Skärmar: | Asus VG248QE@144Hz | Samsung S24D340H@60Hz

Permalänk

Jag vet inte om jag hjälper eller stjälper men har du tittat på Eratosthenes såll istället?

Du behöver du inte bry dig med division och rest.