Tips untuk bermain golf dengan numpy, scipy, atau pylab

10

Sudah ada daftar lengkap kiat untuk python di sini , jadi yang saya minta adalah kiat yang khusus berlaku untuk menggunakan numpy, scipyatau pylabpustaka.

Ini bisa berupa cara untuk mempersingkat kode yang sudah digunakan numpy, atau cara untuk mempersingkat operasi python umum dengan menggunakan pustaka ini.

Tolong, satu tip per jawaban.

pengguna2699
sumber
Perhatikan bahwa pylabhanya matplotlib.pyplot+ numpydalam namespace umum yang sudah usang. Bagian numpydari pylabini sepele dalam arti bahwa impor mereka memiliki jumlah byte yang sama, jadi hanya merencanakan hal-hal tambahan yang dapat berasal pylab, tetapi saya menduga bukan itu yang ada dalam pikiran Anda dengan pertanyaan Anda.
Andras Deak
2
@AndrasDeak, saya sadar bahwa menggunakan pylab dianggap sebagai praktik yang buruk, tetapi sangat sedikit dalam codegolf dapat dianggap sebagai praktik yang baik. Pylab secara langsung termasuk bagian dari banyak numpypaket. Misalnya pylab.randintberlaku di mana numpy akan membutuhkan numpy.random.randint. Jadi untuk golf pylabharus memberikan kode yang lebih pendek.
user2699
1
Saya sadar bahwa penghinaan bukanlah masalah, maksud saya adalah bahwa itu juga tidak memberi keuntungan. Saya tidak menyadari bahwa subpackages juga dimuat ke namespace pylab seperti itu! Maaf, Anda benar sekali :)
Andras Deak

Jawaban:

5

Manfaatkan siaran Numpy

Broadcasting berarti mereplikasi array multidimensi sepanjang beberapa dimensi singletonnya agar sesuai dengan ukuran array lainnya. Ini terjadi secara otomatis untuk array Numpy ketika operator aritmatika diterapkan pada mereka.

Misalnya, untuk menghasilkan tabel perkalian 10 × 10 yang dapat Anda gunakan

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

Cobalah online!

Di sini tdibuat sebagai array Numpy [1, 2, ..., 10]. Ini memiliki bentuk (10,), yang setara dengan (1,10). Array operan lainnya t[:,None],, memiliki ukuran (10,1). Mengalikan dua array secara implisit mereplikasi mereka, sehingga mereka berperilaku seolah-olah keduanya memiliki bentuk (10,10). Hasilnya, yang juga memiliki bentuk (10,10), berisi produk untuk semua pasangan entri dalam array asli.

Luis Mendo
sumber
Itu adalah penggunaan cerdik dari zippenyiaran, apakah itu akan muncul dengan jawabannya sendiri?
user2699
@ user2699 Saya tidak berpikir itu layak jawaban terpisah, karena [*zip(t)]memiliki jumlah byte yang sama dengan yang lebih mudah dibaca t[:,None]. Tapi Anda benar, mungkin perlu diperhatikan, jadi saya menambahkannya kembali di sini
Luis Mendo
Poin bagus, saya kira saya tidak benar-benar menghitung byte. [*zip(t)]akan lebih pendek dua byte jika ada lebih banyak dimensi.
user2699
1
Perhatikan bahwa perpanjangan penguraian yang diperpanjang [*zip(t)]hanya akan bekerja pada python 3.
Andras Deak
Saya melihat halaman ini karena saya tertarik untuk mencari tahu apa yang numpy miliki yang tidak dimiliki Perl 6. Pokoknya itu akan ditulis sebagai my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]atau Anda dapat menggunakanzip(t)
Brad Gilbert b2gills
2

Gunakan r _ [...] alih-alih rentang (...)

Numpy menyediakan sintaksis seperti matlab untuk pembuatan array r_[...]. Setiap notasi slice di antara tanda kurung ditafsirkan sebagai array dengan kisaran yang ditunjukkan. Jadi misalnya

r_[:30:4]

setara dengan

arange(0,30,4)

dan untuk sebagian besar penggunaan dapat menggantikan

range(0,30 4)

Itu juga dapat menangani ekspresi yang lebih kompleks. Misalnya untuk mendapatkan indeks dari 0 hingga 10 dan mundur lagi,

r_[:10,10:-1:-1]
pengguna2699
sumber