強弱と高低

Python3をメインに

numpy savetxtで複素数も扱うとき

savetxtを複素数でも扱う

普通savetxtは実数だけで扱っているので複素数のことなど気にも留めない。 そのまま複素数もいけるのかと思いきや、そうは問屋は卸さない。

問題

複素数を含む数をarrayに入れたまま保存すると、(1.00000000e + 1,0000000ej)なんて形になってしまう。この括弧が厄介でこれのせいでpandasでも呼び出せはするがアクセスができないなんてことになる。

解決

numpy savetxt complexとググれば答えは見つかりはする。

python - Writing and reading complex numbers using numpy.savetxt and numpy.loadtxt - Stack Overflow

ここでは

numpy.savetxt(save, array.reshape(1, array.shape[0]), newline = "\r\n", fmt = '%.4f%+.4fj '*4)

こうやるといい、と書いてある。しかしこのまま保存するとcsvにならず連続で4つの実数と虚数の組が並んでしまう。delimiterをホワイトスペースかカンマにするだけなのだが、お好きな方で。 カンマにするときは、

numpy.savetxt(savefilename, array, fmt = '%.4f%+.4fj, '*4, delimiter=',')

とすると綺麗にCSVになってくれる。 *4は、要するに列数だ。100列あるなら*100になるというわけ。また肝はfmt = '%.4f%+.4fj, '*4,でfmtの中にカンマを指定すれば思い通りに出力してくれる。

こんな感じでいじることができるので、任意の出力に対応することができる、らしい。複素数は今回のように出力するのが良いのではないだろうか。

MATLAB melbankmとは

melbankm

voiceboxに入っているフィルターかませる関数。これを元信号に乗算すればフィルターをかけたことになる。

詳細は以下のURL

Description of melbankm

使い方

melbankm(p,n,fs,fl,fh,w)をとり、

  • p : フィルターの数
  • n : FFTの一つの窓に含まれるデータ数
  • fs : サンプリング周波数
  • fl : 最小周波数
  • fh : 最大周波数
  • w : (任意)設定
melw = melbankm(p,n,fs,fl,fh,w)
(signal) * melw

これだけでいける。


利用者がいないのか、それとも英語だけでいけるからなのかわからないが英語くらいしかページがなかったし、あとはもう中国語になっていた。なので支援も兼ねて。

TeXworksのplatex有効化にいろいろ頑張っているようだけど・・・

TeXworksを日本語で使うにあたって

blog.livedoor.jp

のような所謂、platexのタイプセットを追加して・・・とある。もちろんUbuntuでの話。

だけどさ

例えばコマンド設定のところでlatex -interaction=nonstopmode %.tex ってある。これをさplatex -interaction=nonstopmode %.texにすれば動いてしまうわけですよ。 pをコマンドに追加すれば終了なわけで、/usr/local/binに須藤で追加できない環境下だったら先に進めないわけですよ。

こういう方法もある。目的はさっさとTeXworksを動かすことなので手段を間違えると人によっては詰んでしまう。

Pythonで並列処理入門

入門編でやれること

リストを順に処理するときに並列で処理したい!

data_list = ["a", "b", "c", "d"]

for i in data_list:
    #Do something

こういうのをコア数に応じて並列で処理してさくっと終えたい。ときに使える。

どうやるか

from multiprocessing import Pool

data_list = ["a", "b", "c", "d"]
def wrapper_main(nakami):
    #Do something

myprocess = Pool()
myprocess.map(wrapper_main, data_list)
myprocess.close()

実際に書く量はほとんど変わらない。もちろん、ひとつのリストの中身だけで完結することが大前提(並列処理って言ってるしね)。


少しずつ見ていきたい。

from multiprocessing import Pool

これで呼び出し

def wrapper_main(nakami):  
    #Do something

本来やりたい処理をここに入れる。変数nakamiはdata_listの中身のこと。ラッパーを書くときは、リストを引数に与えるのではなくリストの中身を与えた場合の処理を書く。

myprocess = Pool()
myprocess.map(wrapper_main, data_list)
myprocess.close()

これはほとんどおまじない。Poolの中に例えばPool(12)とすると12コアだけ使ってくれる。何も入れないとフルで使うことになる。 肝心なのはプロセスオブジェクト.map(関数名, リスト)という使い方。

これさえ守ればあっという間にマルチプロセスができる。

コアごとに違う処理を押し付けたい場合やwrapperの引数が二次元リストだったり複数あったりする場合は中級編として既存のブログ等を参考にすればできる。マルチスレッドとマルチプロセスの違いなども割愛。

pandasで条件にあった行を抽出してさらに列を指定する

やりたいこと

ある巨大行列のなかで、特定の列の値がXである行を抽出する。そしてさらに利用する列を指定する。

コード

import pandas as pd
df = pd.read_csv("test.csv", header=None)

df[df[2] == X].ix[:,5:90]

df[2] == Xが第2列の値がXである行を抽出してくれる。
更に加えて、.ix[;5:8]をすることで抽出した行の中から5列から7列目までの列を取り出してくれる。

とても便利ですねpandas

情報系のためのエンベロープスペクトル

エンベロープスペクトル

情報系からしたらなんだそれ、の代物だが怖いことはない。
エンベロープ(エンベロップ)は包絡線であって、なんの包絡線かというとスペクトルの、だ。

求め方

ある波yがあって、それをフーリエ変換すると縦軸パワーの横軸周波数インデックスが出来上がる。

実はこれの包絡線を求めるのがエンベロップスペクトル。 これを波と見立てて、y'とするとy'を更にフーリエ変換したものにローパスフィルタをかけて逆フーリエ変換をしたものがエンベロップになる。

機械系の人たちの間では常識らしい。がぐぐってもなかなか出てこないので苦戦した。

タプルの罠から抜け出すために

(123,) ←こういうやつ

(123,)は、行列のようなもの。 numpy.loadtxt()とかするとこんな感じになってしまう。 すると計算できなくなったりして本当に困っていた。 行列計算ができなくなる。 dot(a, b)とかができなくなってしまう。

できれば見たくない。。。。というくらいに。

reshapeなんてあったのか

x = (123, )もx.reshape(123,1)であっさり型が変わるようだ。

なんてこった

結局、(123, )こいつはなんて呼ぶのだろう。タプルかと思ったけど、違っているのかもしれない!!