Numpy, scipy veya pylab ile golf oynamak için ipuçları


10

Zaten burada python için kapsamlı bir ipucu listesi var , bu yüzden istediğim numpy, scipyveya pylabkütüphanelerini kullanmak için özellikle geçerli olan ipuçları .

Bunlar, halihazırda kullanılmakta numpyolan kodu kısaltmanın veya bu kitaplıkları kullanarak yaygın python işlemlerini kısaltmanın yolları olabilir.

Cevap başına bir ipucu, lütfen.


Kullanımdan kaldırılmış ortak ad alanında pylabyalnızca matplotlib.pyplot+ olduğunu unutmayın numpy. Bir numpykısmı, pylabithalatlarının aynı sayıda bayta sahip olması anlamında önemsizdir, bu yüzden sadece çizim çizimleri ek olarak gelebilir pylab, ancak sorunuzla ilgili aklınızdaki şeyden şüpheleniyorum.
Andras Deak

2
@AndrasDeak, pylab kullanmanın kötü uygulama olarak kabul edildiğinin farkındayım, ancak codegolf'ta çok az şey iyi uygulama olarak kabul edilebilir. Pylab doğrudan birçok numpypaketin parçalarını içerir . Örneğin pylab.randintnumpy'nin gerekli olduğu yerlerde geçerlidir numpy.random.randint. Yani golf pylabiçin daha kısa kod sağlamalıdır.
user2699

1
Kullanımdan kaldırılmanın bir sorun olmadığının farkındayım, bence avantaj da vermiyor. Alt paketlerin de bu gibi pylab ad alanına yüklendiğini fark etmedim! Çok üzgünüm, haklısın :)
Andras Deak

Yanıtlar:


5

Numpy'nin yayınlarından yararlanın

Yayın, çok boyutlu bir diziyi, tekil boyutlarının bir kısmı boyunca başka bir dizinin boyutuyla eşleştirmek için çoğaltmak anlamına gelir. Bu, aritmetik işleçler bunlara uygulandığında Numpy dizileri için otomatik olarak gerçekleşir.

Örneğin, 10 × 10 çarpım tablosu oluşturmak için

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

Çevrimiçi deneyin!

Burada tNumpy dizisi olarak oluşturulur [1, 2, ..., 10]. Bu, (1,10) 'a eşdeğer olan (10,) şekline sahiptir. Diğer işlenen dizisi, t[:,None](10,1) boyutuna sahiptir. İki diziyi çarpmak onları dolaylı olarak çoğaltır, böylece her ikisi de şekli varmış gibi davranırlar (10,10). Ayrıca şekli (10,10) olan sonuç, orijinal dizilerdeki tüm giriş çiftleri için ürünleri içerir.


Bu zipyayınla akıllıca bir kullanım oldu , bu kendi cevabında ortaya çıkacak mı?
user2699

@ user2699 Ayrı bir cevaba değdiğini düşünmüyorum, çünkü [*zip(t)]daha okunabilir olanla aynı bayt sayısına sahip t[:,None]. Ama haklısın, kayda değer olabilir, bu yüzden buraya geri ekledim
Luis Mendo

İyi bir nokta, sanırım baytları saymadım. [*zip(t)]daha fazla boyut olsaydı iki bayt daha kısa olurdu.
user2699

1
Genişletilebilir yinelenen ambalajın açılmasının [*zip(t)]sadece python 3 üzerinde çalışacağını unutmayın.
Andras Deak

Perl 6'nın neyin sahip olmadığını öğrenmekle ilgilendiğim için bu sayfayı gördüm. Her neyse, olarak yazılabilir my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]ya da kullanabilirsinizzip(t)
Brad Gilbert b2gills

2

Aralık (...) yerine r _ [...] kullanın

Numpy, dizi oluşturmak için matlab benzeri sözdizimi sağlar r_[...]. Köşeli ayraçlar arasındaki herhangi bir dilim gösterimi belirtilen aralıkta bir dizi olarak yorumlanır. Örneğin,

r_[:30:4]

eşittir

arange(0,30,4)

ve çoğu kullanım için yerini alabilir

range(0,30 4)

Ayrıca daha karmaşık ifadeleri de ele alabilir. Örneğin, 0'dan 10'a kadar indeks almak ve tekrar geri gitmek için,

r_[:10,10:-1:-1]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.