Python の言語仕様で驚いたこと

最近(ようやくというべきか)Python を触っているんだが、他言語に慣れた人がびっくりする Python の特徴。

関数の返り値が複数取れる

多くの人が驚くのがこれだと思う。

y, z = object.function()

というような書き方が平然とまかり通っている。

関数側の実装を

def test()
    return 'test', 100

とすれば(もちろん、こういう書き方が文法的に許される、という前提が必要だが)、 確かに返り値は複数になりますね。

// が切り捨て除算

これはワイだけかな?

最初見たとき、「え、これ # のタイポ?」と思った。

“”” コメント “””

複数言語を使う際に注意払うのがコメントアウトだと思うが、quot 記号3連続というのは斬新でした。

if __name__ == ‘__main__’ の謎

サンプルでよくある

if __name__ == ‘__main__'

という書き方だが、ここあたり参照。

要は、「ある python コードをコマンドラインから実行するときは __name__ に __main__ が引き渡される」というだけの話だと思う。

これをすごくわかりにくく書いてあったり、インデントがおかしいサンプル載っけてたりする記事をよく見かけるが、なんだあれ?

 

(続く)

 

librosa の使い方

python の音響解析の基本的なモジュールは librosa のようなんだが、情報が古い記事が多い。

参考記事

比較的しっかり書かれた記事は

Pythonの音声処理ライブラリ【LibROSA】で音声読み込み⇒スペクトログラム変換・表示⇒位相推定して音声復元

あたりだろうか。

上の記事にしても 2020 年に書かれているので、やや古いのだが、解説が丁寧だし、検証がまとも。

「古い」というのは、例えば、librosa.display.waveplot などという今では廃止になった関数もしれっと使われていたりするから。
だが、こういうのはエラーメッセージをググるなどすれば、対策は立てやすい。(後継の関数を使うならば、librosa.display.waveshow となる)

参考にならない記事

逆に、古いだけで、処理の意図も書かれていない記事はほぼ害悪。

例えば、STFT(Short-Time Fourier Transform: 短時間フーリエ変換)で出力される行列は、確か 0.8 くらいの時に出力形式そのものが変わったのだが、このことを意識していないと実用(波形データ→STFT→加工→逆 STFT →加工した波形データなど)に使う際に間違ったことをやりねない。

SoundFile との併用

便利な librosa だが、配列をファイルに書き出そうとすると使い勝手が悪いらしい。
(『librosa における 16-bit でのWAV書き出し』参照)

そこにもあるように SoundFile というパッケージを使う。

なお、書き出したファイルは(デフォルトでは)python ファイルのある位置になるようだ。
jupyter notebook の場合は、.ipynb の置かれているフォルダになる。

noisereduce との併用

実際のデータはノイズなどものっているため、これを落とす処理が必要。
その一つに noisereduce パッケージがある。なお、これも librosa 同様、conda ではなくて pip から入れる。

これを使った具体例は、ここあたり参照。

 

3D可視化

波形データの可視化は、上のようにやればいいが、ものによっては3Dで可視化したい場合がある。

pyVISTA というのがあるらしい。

pythonをインターフェイスにして VTK を呼び出して・・・ってこれ MacOS じゃダメじゃん。
VTK は OpenGL に依存しているので、MacOS では非推奨の VTK 使ってる時点でアウト。

日本からは小山哲央という人が参加しているらしいのだが、この人ってやらかしちゃった人ですよね。

スクリプト言語が関の山で、Java/C/C++ 使いこなす能力はないでしょう、この人。

将来性、イマイチ。

 

Anaconda Python For Mac の使い方(メモ)

Anaconda Python のインストール記事は数多くあるが、実務的な使い方はそんなに多くない。

Anaconda Pythonのインストールと仮想環境の作成 for Mac

あたりで、しっかり仮想環境の作成までやっておくこと。

その後、モジュールをインストール。これも上の続編

Anaconda Pythonにモジュール(numpy, matplotlib)をインストールする for Mac

を参考に。

ただし、MacOS Ventura 環境ではデフォルトでは python は入っていないようだ。
python は anaconda 環境のみでしか使わないということであれば、その都度 anaconda 環境の python を呼び出した方が何かと混乱は減るように思うので、この流儀に従った方がいいかも。

conda activate

で、base の仮想環境が立ち上がる。この状態なら python は普通に使える。

あるいは以下の方法でもいいらしい。ワイはこの使い方は今のところしていないが。

anaconda インストール時には、まだ python は使えるようになってはいないので、ターミナルから

/(user ホームなど)/opt/anaconda3/bin/conda init zsh

と打ち込み、ターミナルを再起動しましょう。

以降、python などのコマンドが使えるようになります。
(『MacOS 版 Anaconda のインストール』参照)

 

conda と pip の使い分け

例えば、波形解析でよく使われる librosa は現時点(2023/2 月)では conda のチャンネルにはないので、pip install で入れる必要がある。

正しくインストールできていれば、anaconda navigator からでも下のように認識してくれるようだ。

なお、librosa の紹介記事のサンプルなどで

 y, sr = librosa.load(librosa.util.example_audio_file())

というのがよく出てくるが、現在はこのメソッドは使えない

また、Mac では .ogg ファイルが読み込めないようだ。(ffmpeg を入れておけば大丈夫っぽいです)

jupyter notebook の保存先フォルダ変更

デフォルトでは、ホーム直下になるので、ホームが乱雑になる。

【Mac】jupyter notebookのディレクトリ変更方法

で適宜変更しておくと良いだろう。