numpy、scipy、またはpylabでゴルフするためのヒント


10

pythonのためのヒントの包括的なリストすでにありますここでは、どのような私が求めているが、具体的使用に適用されますヒントになるよう、numpyscipyまたはpylabライブラリを。

これらはnumpy、既にを使用しているコードを短縮する方法、またはこれらのライブラリを使用して一般的なPython操作を短縮する方法のいずれかです。

回答ごとに1つのヒントを入力してください。


廃止予定の一般的な名前空間でpylabmatplotlib.pyplot+ numpyにすぎないことに注意してください。のnumpy部分はpylab、それらのインポートが同じバイト数を持っているという意味で取るに足らないことです。したがって、プロットのものだけがから追加で得られる可能性がありpylabますが、それはあなたが質問で考えていたものではないようです。
Andras Deak

2
@AndrasDeak、私はpylabを使用することは悪い習慣と見なされていることを知っていますが、コードゴルフではほとんど良い習慣と見なすことはできません。Pylabには、多くのnumpyパッケージの一部が直接含まれています。たとえばpylab.randint、numpyが必要とする場合に有効ですnumpy.random.randint。したがって、ゴルフpylabでは短いコードを提供する必要があります。
user2699 2018

1
私は非推奨が問題ではないことを認識しています。私の主張は、それも利点をもたらさないということでした。サブパッケージもそのようなpylab名前空間に読み込まれていることに気づかなかっただけです!申し訳ありませんが、あなたは完全に正しいです:)
Andras Deak

回答:


5

Numpyのブロードキャストを利用する

ブロードキャストとは、いくつかのシングルトン次元に沿って多次元配列を複製して、別の配列のサイズと一致させることを意味します。これは、算術演算子がそれらに適用されるときに、Numpy配列に対して自動的に行われます。

たとえば、10×10の九九を生成するには、次を使用できます。

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

オンラインでお試しください!

ここでtはNumpy配列として作成され[1, 2, ..., 10]ます。これの形状は(10、)で、(1,10)と同等です。もう1つのオペランド配列のt[:,None]サイズは(10,1)です。2つの配列を乗算すると、暗黙的に複製されるため、2つの配列が両方とも形状(10,10)を持っているかのように動作します。結果も形状(10,10)で、元の配列のすべてのエントリのペアの積が含まれています。


それはzip放送での巧妙な使用法でしたが、それはそれ自体の答えで出てくるのですか?
user2699

@ user2699読みやすさと[*zip(t)]同じバイト数を持っているので、別の答えをする価値はないと思いますt[:,None]。しかし、あなたは正しい、それは注目に値するかもしれないので、ここに追加し直しました
ルイスメンド

良い点、私は実際にバイトを数えなかったと思います。 [*zip(t)]より多くの次元がある場合、2バイト短くなります。
user2699

1
で反復可能アンパックを拡張ノート[*zip(t)]のpython 3になります唯一の仕事
アンドラーシュデアーク

このページは、Perl 6にはないnumpyの機能を知りたいと思って表示しました。とにかく、それをmy \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]使用するか、または使用できるzip(t)
Brad Gilbert b2gills 2018

2

range(...)の代わりにr _ [...]を使用します

Numpyは、を使用して配列を作成するためのMATLABのような構文を提供しr_[...]ます。大括弧の間のスライス表記は、指定された範囲の配列として解釈されます。したがって、たとえば

r_[:30:4]

に相当

arange(0,30,4)

そして、ほとんどの用途で置き換えることができます

range(0,30 4)

より複雑な式も処理できます。たとえば、0から10までのインデックスを取得し、再び下に戻すには、

r_[:10,10:-1:-1]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.