Wskazówki dotyczące gry w golfa przy użyciu numpy, scipy lub pylab

10

Nie ma już pełną listę wskazówek dla pytona tutaj , więc co ja z prośbą o wskazówki, które są specjalnie dotyczą użyciu numpy, scipyczy pylabbibliotek.

Mogą to być albo sposoby skracania już używanego kodu numpy, albo sposoby skracania typowych operacji w Pythonie za pomocą tych bibliotek.

Poproszę jedną wskazówkę na odpowiedź.

użytkownik2699
źródło
Zauważ, że pylabto tylko matplotlib.pyplot+ numpyw przestarzałej wspólnej przestrzeni nazw. Ta numpyczęść pylabjest trywialna w tym sensie, że ich import ma taką samą liczbę bajtów, więc dodatkowo można było tylko wykreślić rzeczy pylab, ale podejrzewam, że nie o to ci chodziło w pytaniu.
Andras Deak
2
@AndrasDeak, zdaję sobie sprawę, że używanie pylab jest uważane za złą praktykę, ale bardzo niewiele w codegolf można uznać za dobrą praktykę. Pylab bezpośrednio zawiera części wielu numpypakietów. Na przykład pylab.randintobowiązuje tam, gdzie wymagałoby numpy numpy.random.randint. Więc do gry w golfa pylabnależy podać krótszy kod.
user2699
1
Zdaję sobie sprawę, że wycofanie się nie stanowi problemu, miałem na myśli, że nie daje ono także korzyści. Po prostu nie zdawałem sobie sprawy, że podpakiety zostały również załadowane do przestrzeni nazw pylab w ten sposób! Więc przepraszam, masz całkowitą rację :)
Andras Deak

Odpowiedzi:

5

Skorzystaj z Numpy transmisji

Nadawanie oznacza replikację tablicy wielowymiarowej wzdłuż niektórych jej wymiarów singletonu, aby dopasować ją do wielkości innej tablicy. Dzieje się tak automatycznie w przypadku tablic Numpy, gdy zostaną do nich zastosowane operatory arytmetyczne.

Na przykład, aby wygenerować tabliczkę mnożenia 10 × 10, możesz użyć

import numpy
t=numpy.arange(1,11)
print(t*t[:,None]) # Or replace t[:,None] by [*zip(t)]

Wypróbuj online!

Tutaj tjest tworzony jako tablica Numpy [1, 2, ..., 10]. Ma on kształt (10), który jest równoważny (1,10). Druga tablica operandów t[:,None]ma rozmiar (10,1). Pomnożenie dwóch tablic niejawnie implikuje je, więc zachowują się tak, jakby oba miały kształt (10,10). Wynik, który również ma kształt (10,10), zawiera produkty dla wszystkich par wpisów w oryginalnych tablicach.

Luis Mendo
źródło
To był sprytny użytek zipz nadawania, czy to pojawi się we własnej odpowiedzi?
user2699
@ user2699 Nie sądzę, że warto osobną odpowiedź, ponieważ [*zip(t)]ma taką samą liczbę bajtów, co bardziej czytelna t[:,None]. Ale masz rację, być może warto to zauważyć, więc dodałem to tutaj
Luis Mendo
Dobra uwaga, chyba nie liczyłem bajtów. [*zip(t)]byłyby dwa bajty krótsze, gdyby było więcej wymiarów.
user2699
1
Zauważ, że rozszerzone iterowalne rozpakowywanie [*zip(t)]będzie działało tylko na Pythonie 3.
Andras Deak
Przeglądałem tę stronę, ponieważ jestem zainteresowany dowiedzieć się, ile numpy ma ten Perl 6. W każdym razie to byłoby napisane jako my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]lub można by użyćzip(t)
Brad Gilbert b2gills
2

Użyj r _ [...] zamiast zakresu (...)

Numpy zapewnia składnię podobną do Matlaba przy tworzeniu tablic r_[...]. Każda notacja plastra pomiędzy nawiasami interpretowana jest jako tablica ze wskazanym zakresem. Na przykład

r_[:30:4]

jest równa

arange(0,30,4)

i dla większości zastosowań może zastąpić

range(0,30 4)

Może także obsługiwać bardziej złożone wyrażenia. Na przykład, aby uzyskać indeksy od 0 do 10 i ponownie w dół,

r_[:10,10:-1:-1]
użytkownik2699
źródło