Pythonのお勉強 Part55
■ このスレッドは過去ログ倉庫に格納されています
>>639 わからないならレスしないでくださいうざいだけです >>636 matplotlib qt4agg とかで検索すると幸せになれるかもしれない >>638 wxaggもqt4aggもmatplotlibの表示先を変えるための実装なので、殊更wxの方が簡単なわけではないと思うけど。 >>641 は意味わかるの? 俺はさっぱりなんだが。 https://www.tutorialspoint.com/pyqt/pyqt_qclipboard.htm ここのexampleのソースコードさがしてるんだけど、このサイトのどこかにありますか?探しても見つからない。 これと同じものが書ければ解決なんですが Numpyで二つの一次元配列を要素順(縦方向)に比較して何個一致してるか計算したいのですが、 どうしたら良いのでしょうか?どなたかご教授お願いします。 [1,2,3,4,5] [1,2,3,5,4] この場合1,2,3が一致してるので、一致率は6割。 こんな感じの計算をしたいのです。 >>650 なんか自分ではやりたくない宿題・課題を俺らにやらせようって感じを受けるんだが... >どうしたら良いのでしょうか? 日本語でそれをやる手順を書けるのか? 実はそれすらわからないのか? こうなるとPython以前のことになる 宿題じゃなくて自主的に勉強してます。 煽りはやめて>< 自分なりに頑張って勉強してます。 調べてもよくわからなかったので質問させて頂きました。 煽り耐性がないのでマジで凹みます。 本当に煽りはやめてください。。。 まさか、まったくわからないわけではないだろう どういうアプローチがあると考えて、それはどうしてうまく行かなかったのか書いてみて? ifとforで一個一個比較して一致したものをカウントするという原始的な方法なら思いついたのですが 配列の要素が数十万とかになると計算に凄く時間がかかりすぎて自分はおかしな事をしてると思いました。 Numpyを使えばもっと早く計算できるのではないかと思ったのです。 Numpyで配列同士を除算して1になったものをカウントするという方法も考えましたが 何かもっとよい方法があるのではないかと思って質問するに至りました。 >>657 >>650 と話変わってないか? >>650 は要素数5つのリストで,どうしたら良いのでしょうか?(さっぱりわかりませんな感じ) >>657 では実はifとforで一個一個比較する方法でなら出来た(?)、でも、その方法だと 要素が数十万とかになると計算に凄く時間がかかりすぎるから何か時短できるやり方はない? 考え方は別に間違ってないと思うけど、なぜ最後までやってみてから検討しないのか a=比較対象のリスト1 b=比較対象のリスト2 c=a-b #一致する箇所だけ数値が0になる count=len(np.where(c==1)[0]) #0の数をカウント par=count/len(c)*100 #割合を求める >>660 ありがとうございます。 考え方は間違ってなかったんですね! そのコードを使わせていただきます。 行列にする aは 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 になる bは aは 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 5 0 0 0 4 0 になる 線形代数使って対角線を一発で判断 bは 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 4 0 0 0 5 0 かな まあがんがれ >>663 線形代数!? 勉強したことないので勉強してみます。 ありがとうございます。 行列にする分、メモリは食いそうですが 速度は早くなるんでしょうか? やっぱ機械学習や、時系列扱う場合線形代数は必須ですよね。。。 >>> import numpy as np >>> from itertools import zip_longest >>> >>> a = [1,2,3,4,5] >>> b = [1,2,3,5,4] >>> np.mean([v1==v2 for v1,v2 in zip_longest(a,b)]) * 100 60.0 >>> >>> import random >>> c = [random.randrange(1,10) for _ in range(random.randrange(5,10))] >>> d = [random.randrange(1,10) for _ in range(random.randrange(5,10))] >>> np.mean([v1==v2 for v1,v2 in zip_longest(c,d)]) * 100 25.0 >>> >>> c [1, 1, 5, 2, 8] >>> d [1, 2, 7, 2, 9, 5, 1, 1] >>> >>667 配列の要素数が違っても比較できるんですね。 ありがとうございます。 勉強させていただきます。 動的に処理すればメモリは食わない。 比較して、どういうデータが欲しいのか謎 データ形式はリスト(配列)に1つの値しか入って無い前提で良いの? 既に解決してるだろうけどw >>650 a=[1,2,3,4,5] b=[1,2,3,5,4] c=list(zip(a,b)) d=0 for i in c: ____if int(i[0])==int(i[1]): ________d+=1 print(d/len(c)*100) >>669 そういうものなんですね。メモリは食わないんですか! 比較して何個一致してるか。何%一致してるかを知りたいだけです。 要素数が数十万入った場合も想定して とにかく今は速度を最優先に考えております。 データはリスト内に1つの前提で構いません。 >>670 いくつか解決策は見つかりましたが 色々なコードを見られるのは勉強になります! ってかw 一行で書けるのかww 地道にfor文回して行く方法しか思い付かない >>665 比較や条件分岐がなくなると爆高速になる こうじゃね a = np.array([1, 2, 3, 4, 5]) b = np.array([1, 2, 3, 5, 4]) np.sum(a == b) / a.size >>674 そういうものなんですね。 ありがとうございます。頑張ってみます! >>675 ありがとうございます。 関数を作ってくれたんですね! コードを勉強させていただきます。 >>676 おぉ。凄くシンプルですね。 Numpyを使うとこんなシンプルにコードが掛けけるんですね? ありがとうございます。 >>676 ?シンプルだよね。可読性、処理速度、隙が無いと思うよ。だけど、おいら負けないよ。 えー、か、改良版が躍動する処理速度を皆さんに見せたいね。 >>> import time, random; import numpy as np; from itertools import zip_longest >>> def oree(a,b): ____same = [True for v1,v2 in zip_longest(a,b) if v1==v2] ____return sum(same)/max(len(a), len(b)) * 100 >>> def omae(a,b): ____a = np.array(a) ____b = np.array(b) ____return np.sum(a==b) / a.size * 100 >>> oree([1,2,3,4,5],[1,2,3,5,4]) 60.0 >>> def timer(func, *args): ____start = time.time() ____r = func(*args) ____end = time.time() ____print(f'{func.__name__} time = {end - start:.5f}, return = {r:.5f}') >>> def test(func1, func2): ____a = [random.randrange(1,200) for _ in range(1000000)] ____b = [random.randrange(1,200) for _ in range(1000000)] ____timer(func1, a, b); timer(func2, a, b) >>> test(oree, omae) oree time = 0.04913, return = 0.50930 omae time = 0.10629, return = 0.50930 >>> test(oree, omae) oree time = 0.05014, return = 0.49830 omae time = 0.09525, return = 0.49830 sum(same) は len(same) より速いのか >>> def oree2(a,b): ____same = [1 for v1,v2 in zip_longest(a,b) if v1==v2] ____return len(same)/max(len(a), len(b)) * 100 こっちが勝った 速度は環境によって違うのでは? 今回の場合は、要素数が少ないからインポートせずに単純な文章で回した方が早い https://ideone.com/nFzAeB 0.02s 27720KB っと 思ったけど、import time挟んだら、実際の測定は遅いだなw https://ideone.com/vN3ZZN >>657 >Numpyを使えばもっと早く計算できるのではないかと思ったのです。 今のところ使わない方が速い その差約2倍! array化するのに時間かかるからね array化済みならnumpyが爆速だけど 速度アップのためにとわざわざarray化すると遅くなるわけよ >>685 その差2倍って大きいな やっている処理は激しく単純で時間かからにかもしれないが 実は前処理のarray化に時間が掛かっている可能性あるよな こんなのはリストを複数部に分けて、それをマルチスレッドでやったほうが良いような感じがするが ちょっとどうなるかやってみた結果 omae time = 0.11590, return = 0.50740 oree time = 0.04688, return = 0.50740 oree2 time = 0.05340, return = 0.50740 yuenchi time = 0.06901, return = 0.50740 array化して処理したomaeは>>683 の超ストレートなやり方(yuenchi)にすら負けている リストの要素数5個で比較したらそんなもんでしょ。 5個ならNumpy使う必要ない。 もっと要素数を増やして比べてみたら? >>680 の時間測定はリストの要素数5個で比較だったのか... 要素数5個の処理にこんなに時間かかるって、PCが激遅い、Pythonが激遅い またはその両方が激遅いだな。 俺レベルだと20マンコがいいとこだな 100マンコとかうらやましくもあり >>685 そうなんですか! CSVを読み込む場合はどうなんでしょうか? >>693 どうなんでしょ?ってどういうこと? numpyから読み込めばarray型で取得できるみたいだよ ファイルからの読込含めて処理速度がどなるかってこと? どうなんでしょうね?ファイル読込速度が同じなら当然oree2が最速だろうし、 np.loadtxtのファイル読込速度が爆速なら巻き返せるし・・ おもしろ実験やってみてください! >>> import numpy as np >>> data = np.loadtxt('test.csv',delimiter=',') >>> data array([[ 1., 2., 3., 4., 5.], [ 1., 2., 3., 5., 4.]]) >>> a = data[0]; b = data[1] >>> np.sum(a==b) / a.size * 100 60.0 >>> >>> from itertools import zip_longest >>> import csv >>> with open('test.csv') as f: ____reader = csv.reader(f) ____data = [row for row in reader] ____a = data[0]; b = data[1] ____same = [1 for v1,v2 in zip_longest(a,b) if v1==v2] ____len(same)/max(len(a), len(b)) * 100 60.0 >>> >>636 Pyqtで最近測定プログラム作った Matplotlib使った方が見た目綺麗だけど、pyqtgraphの方が軽いし、速さの追求ができる >>695 >どうなんでしょ?ってどういうこと? 僕は何もしませんから、僕の代わりにCSVを読み込で行う場合の numpy版と非numpy版での実評価・考察をしてクレクレと言うことだろう >>696 そうなのか... シミュレーション結果を折れ線グラフにするだけだから,グラフパッケージにこだわりはないんだよね 問題は,そもそもpyqtの構造を理解できていないというところなんだ... なんちゃってで出来るかと思ったんだけど...また挑戦しようと思います NumPyが遅かったらCuPy使えばいい Pythonが遅かったらCython使えばいい Ruby で作った。 count で、ブロックの戻り値が真のものを数える aryA = [1, 2, 3, 4, 5] aryB = [1, 2, 4, 3, 5] count = aryA.each_with_index.count { |num, idx| num == aryB[idx] } puts count / aryA.length.to_f #=> 0.6 >>680 >>695 oreeは一致率10%未満の時しか速くならない >>700 それだったらzip使ったほうがきれいなような count = aryA.zip(aryB).count { |i, j| i == j } 平等な条件を用意してこうするべきだと思う >>> import time, random; import numpy as np; from itertools import zip_longest >>> def oree(a,b): same = [True for v1,v2 in zip_longest(a,b) if v1==v2] return len(same)/max(a.size, b.size) * 100 >>> def omae(a,b): return np.sum(a==b) / a.size * 100 >>> def timer(func, *args): start = time.time() r = func(*args) end = time.time() print(f'{func.__name__} time = {end - start:.5f}, return = {r:.5f}') >>> def test(func1, func2): a = np.array([random.randrange(1,200) for _ in range(1000000)]) b = np.array([random.randrange(1,200) for _ in range(1000000)]) timer(func1, a, b); timer(func2, a, b) a = np.array([_ for _ in range(1000000)]) b = np.array([_ for _ in range(1000000)]) timer(func1, a, b); timer(func2, a, b) >>> test(oree, omae) >>781 a = [random.randrange(1,10) for _ in range(1000000)] b = [random.randrange(1,10) for _ in range(1000000)] これするだけでも全然逆になるよね >>698 それなら、なおのことpyqtgraphの方がいいかも 僕は実験系だから、装置のコントロールとかも含めてPyqtでGUI作って、リアルタイムプロットを埋め込んだけど シミュレーション中に何かのタイミングで描き出すとか最後に描き出すなら、pyqtgraphの方が呼び出しが楽だと思う とりあえずpyqtgraphとpyqtかpysideインスコして、 import pyqtgraph.examples pyqtgraph.examples.run() やってみ サンプルコードが出てくるし、pyqtを露わに使わなくて良いので、コードも書きやすいと思う a = [random.randrange(1,200) for _ in range(10000)] b = [random.randrange(1,200) for _ in range(10000)] print(np.linalg.matrix_rank(np.diag(a) - np.diag(b)) / a.size * 100) 皆さん、相談させてください。 魔方陣を5個吐き出すプログラムを作ったのですが、 import random abc=[1,2,3,4,5,6,7,8,9] count=0 while count<5: ____random.shuffle(abc) ____if abc[0]+abc[1]+abc[2]==15 and abc[3]+abc[4]+abc[5]==15 and abc[6]+abc[7]+abc[8]==15\ and abc[0]+abc[3]+abc[6]==15 and abc[1]+abc[4]+abc[7]==15 and abc[2]+abc[5]+abc[8]==15\ and abc[0]+abc[4]+abc[8]==15 and abc[2]+abc[4]+abc[6]==15: ________print(abc[0],abc[1],abc[2]) ________print(abc[3],abc[4],abc[5]) ________print(abc[6],abc[7],abc[8]) ________count=count+1 ________print(count) ________print("------") 同じ魔方陣を重複して出力してしまう事があります。 これを解決する方法はありませんか? そもそもランダムで並び替えするって発想自体が邪道なんですかね。 僕は最近Pythonを初めた初心者です。 アドバイスお願いします。 random.shuffleをやめてpermutationを使う 魔法陣では無く、 ヒンズーの連続方式です。 縦、横、斜め 全て合計が同じ 一番上の行の一番真ん中に"1"を書きます。 これは奇数x奇数の魔方陣ではどれも同様 斜め右上に数字を書いて行き、ぶつかったら一つ下がるということを繰りかえす http://d.hatena.ne.jp/shuu33jp/20140423/1398250961 >>710 ありがとう。 ググってみたけどshuffleと違いがわからなかったです。 どのように使うのですか? もう少しヒントを下さい。。。 >>711 ありがとう。 そのルールは知ってたのですが、 並び替えして力技でいったほうがコードが簡単そうなので>>709 の様なコードになってしまいました^^; >>710 あ!すません。。。 NumPyのpermutationではなく itertoolsのpermutationsを使うんですね!! なんとなく答えが見えました。 9要素 一致 362,880通り*合計の確認= 処理数 なんとなく答えが見えました。 (笑) 8かww 362,880通り*8= 1/2903040?wwww 9!=362880通り 3*3でもこの数だと。。。 4*4とかになると厳しそうですね。。 >>711 のサイトを参考に別のアプローチも考えてみますw そんなww 事よりコード書くぞwww 00,01,02 10,11,12 20,21,22 3 エラー ー1エラー >>720 すいません。 わかりません。 それはなんですか。 よく考えると重複を含むランダムで魔方陣を作成する>>709 のコードだと 362880回の計算どころじゃすまないですねw でも意外と早く魔方陣が出力されたので今のPCは凄く計算が早いんですね。 なんか色々と学べた。ありがとう。 0,1判断のNoneに+=1 なんてツッコミは面白くない #下wwww def click_down(brave_x,brave_y): return brave_x, brave_y+1 # 右上 def click_up01(brave_x,brave_y): return brave_x+1, brave_y-1 駄目だだぁああwwww ヒンニュー連動ぐらい 1シコ(日)2シコ ぐらいで頑張っちゃおう!!!wwww なんてぇっなwww なんか僕には何をしてるのかわからない。 分析してみます。 >>727 すごい! n*nの魔方陣を出力できるんっすね! 降参 indexでやってるけど、外に出た時のエラーで躓く 範囲外エラーを1つずつ指定して書いてるから拡張性が無いww matplotlibでグラフ出力するときに、数秒ごとのデータが長期間とかあると軸に書かれた日付がまっくろになってしまったりすので、1日ごととか3日ごとのテキスト区切りにしたいのですが、表記方法を教えてください。 DataFrameならdate_rangeとかにしとくと勝手に間引いてくれてる気がする 誰か助けて〜 from random import choice list_ = [0,1,2,3,4,5,6,7,8] for i in list_: ____place = choice(list_) ____del(list_[place]) ____print(list_) リストからランダムで一つずつ要素を削除するプログラムを作りたいのですがエラーがでます(汗) IndexError: list assignment index out of range ↑これです(泣) もうかれこれ5時間格闘中です。 リストからの選択は必ずchoiceを使う事が条件です。 import random marks = [0,1,2,3,4,5] t=random.choice(marks) del marks[t-1] print(marks) >>737 うわぁ、ありがとう。 でも、そのコードでもforとかで繰り返すとエラーになります。 原因がわからないです。 何周かして例えばリストの要素数が5個になった時にchoiceで8が出たら list_[8]にアクセスするわけで… ありがとう!! delの機能を勘違いして使ってました。 そういうことだったのね((泣)) ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる