裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Python 嫌いだけど,こんな Python プログラムはいやだ(その1)

2020年12月10日 | Python

a がリストなんだが(そもそもリストである必然性はないが),その合計を求めるのに

a = [5, 5, 5, 2, 4, 1, 2, 4, 4, 3, 4, 2, 1, 1]

t = 0
for j in range(len(a)):
    t += a[j]

print(t)

t は 43 になるが,こんなものに 3 行もかける意義はない

t = sum(a) で十分

作者は従来のプログラミング言語の作法に毒されている模様。

なお,a.sum() はエラーになるのが Python の,なところ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

複数の変数をインクリメントする

2020年12月09日 | Python

一行で書くとこうなるか

a, b, c, d = 1, 2, 3, 4

それぞれに 1 を足す

import numpy as np
a, b, c, d = np.array([a, b, c, d]) + 1

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

IPA フォント(Python)

2020年12月08日 | Python

IPA フォントをインストールしたのにちゃんと使えないということだったが,

~/.matplotlib の中にある,2 つのファイルを削除する(いきなり削除するのが怖い人は,名前を変える)

-rw-r--r--  1 foo  503  104286 10 31  2017 fontList.cache0  これと
-rw-r--r--  1 foo  503  165099  9 12 15:58 fontList.json0  これ
-rw-r--r--  1 foo  503  136304  1 11 09:28 fontlist-v300.json(これは例え削除しても再度作られる)
-rw-r--r--@ 1 foo  503   33307  1 11 09:25 matplotlibrc
drwxr-xr-x  2 foo  503      64  1 23  2014 tex.cache/

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

今更ながら思う,あほか,と(Python)

2020年12月07日 | Python

>>> x = [1,2,3,4,5]
>>> y = [3,2,1,5,4]


>>> x*y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'list'

>>> x+y
[1, 2, 3, 4, 5, 3, 2, 1, 5, 4]

>>> x-y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'list' and 'list'

なんの意味があるのやら

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

また,Hydrogen が動かなくなった(Python)

2020年12月06日 | Python

Atom が自動更新した(そのような設定のままなのだが)。そうしたらまた,Hydrogen が動かなくなった。

今度も ipykernel_launcher がないと言っているけど,前に修正した kernel.json はそのままになっている。

調べたら,ipykernel 自体がなくなっている(どうしてかはわからない)。

sudo pip install ipykernel でインストールしてやったら,前に修正した kernel.json が元に戻って,まだ Hydrogen が動かない。

再度 kernel.json を修正して,やっと動くようになった。

Atom の自動更新を止めよう。

ばっかじゃないの?

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Hydrogen が動かない(Python)

2020年12月05日 | Python

ipykernel_launcher がないとか言っているが

いろいろ調べたところ,

/usr/local/share/jupyter/kernels/python3/kernel.json

の3行目の

"python",

"python3",

にするのだそうだ。

 

こんなことも,ユーザがわざわざやらなくてはならないのか?

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Python の変な仕様?(その3)

2020年12月04日 | Python

関数というのも汎用性のあるように定義するのが定道だとは思うのだが,Python の関数定義には首をかしげざるを得ないものも多い。

その一つとして,矩形を描画する関数の plt.broken_barh は,なんかおかしい。

矩形の (左下隅 x 座標,左下隅 y 座標,右上隅 x 座標,右上隅 y 座標)というようjにしてくれれば,分かりやすいし使いやすいのじゃないか?

import matplotlib.pylab as plt
import scipy as sp

def rect(x1, y1, x2, y2, facecolors="b", edgecolors="k", hatch=""):
    plt.broken_barh([(x1, x2-x1)], (y1, y2-y1), facecolors=facecolors, edgecolors=edgecolors, hatch=hatch)

rect(1, 1, 3, 5)
rect(2, 4, 5, 7, facecolors="red", hatch="/")
plt.show()

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Python の変な仕様?(その2)

2020年12月03日 | Python

>>> import numpy as np
>>> x = sp.array([1,3,7])
>>> x -= 0.3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
numpy.core._exceptions._UFuncOutputCastingError: Cannot cast ufunc 'subtract' output from dtype('float64') to dtype('int64') with casting rule 'same_kind'

>>> x = x-0.3

としてやれば文句は言わない

あるいは,float にしてやれば文句は言わない

>>> x = np.array([1,3,7], dtype=float)
>>> x -= 0.3

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Python で Fisher's exact test をする(Mac の場合)

2020年12月02日 | Python

前に書いた Fisher's exact test(Python) では諦めていたのだけど...

Python で Fisher's exact test を行えるようにした話

まず,目的の FORTRAN プログラムソースをダウンロードする
http://netlib.org/toms/ の中にある file: 643.gz
"unordered rxc contingency tables, Fisher's exact test"

展開してできる 643 というファイルを開き,
   1965 行以降のテストデータを削除する。
   1~31 行のメインプログラムを以下のサブルーチンプログラムで置き換える。
   名前を fisher_lib.f90 として保存する。

C      ALGORITHM 643, COLLECTED ALGORITHMS FROM ACM.
C      THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
C      VOL. 19, NO. 4, DECEMBER, 1993, PP. 484-488.
c                                   Driving program to read and
c                                   process the data file
      subroutine fisher_sub(nrow, ncol, expect, percnt, emin, table,
     &  prt, pre)
      implicit none

      integer    i, j, ncol, nrow
      double precision emin, expect, percnt, pre, prt, table(*)
      intent(in) nrow, ncol, expect, percnt, emin, table
      intent(out) prt, pre
c
      external   fexact
c                                  output TABLE
c      write (*,99998)
c      do 20  i=1, nrow
c         write (*,99997) (table(i+(j-1)*nrow),j=1,ncol)
c   20 continue

      call fexact (nrow, ncol, table, nrow, expect, percnt, emin, prt,
     &             pre)

c99997 format (1x, 10f7.0)
c99998 format (/, 2x, 'The contingency table for this problem is:')
      return
      end

ターミナルで,以下を実行する(fisher_lib*.so ファイルができる)

$ f2py -m fisher_lib -c fisher_lib.f90
 
使用法は,fisher_lib をインポートして,fisher_lib.fisher_sub 関数を呼び出すだけ。
下の fisher() 関数のようなシュガーコートを介して呼び出すと楽ちん。

import numpy as np
import fisher_lib

def fisher(table, expect=0, percnt=0, emin=0):
    nrow, ncol = np.array(table).shape
    prt, pre = fisher_lib.fisher_sub(nrow, ncol, expect, percnt, emin, table)
    return pre

集計表は,以下のように二重リストで与えればよい(numpy.array() でもよい)。

>>> import numpy as np
>>> import fisher_lib

>>> def fisher(table, expect=0, percnt=0, emin=0):
...     nrow, ncol = np.array(table).shape
...     prt, pre = fisher_lib.fisher_sub(nrow, ncol, expect, percnt, emin, table)
...     return pre
... 
>>> table = [[3, 5, 2, 5], [4, 1, 8, 3], [2, 1, 3, 4]]
>>> p = fisher(table)
>>> print(p)
0.26187809176685495

>>> p = fisher(np.array([[12, 2], [5, 11]]))
>>> print(p)
0.003913481855563419

R の fisher.test() で結果が正しいことを確かめる。

> options(digits=15)
> fisher.test(matrix(c(3, 5, 2, 5,  4, 1, 8, 3,  2, 1, 3, 4), byrow = TRUE, ncol = 4))$p.value
[1] 0.261878091766855
> fisher.test(matrix(c(12, 2, 5, 11), 2))$p.value
[1] 0.00391348185556345

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Python の変な仕様?

2020年12月02日 | Python

import scipy as sp

x = sp.reshape(sp.arange(36), (6, 6))

で作成される行列 x

array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23],
       [24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35]])

この行列の小行列

array([[ 6,  8, 10],
       [18, 20, 22],
       [30, 32, 34]])

を作成しようとして,

x[[1,3,5], [0,2,4]]

なんてことをやると

array([ 6, 20, 34])

が得られて,なんだこりゃ?となってしまう。

R なら,これで問題ないのになあと(0 オリジンと 1 オリジンの違いはあるものの)。

> x = matrix(0:35, 6, 6, byrow=TRUE)
> x
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    0    1    2    3    4    5
[2,]    6    7    8    9   10   11
[3,]   12   13   14   15   16   17
[4,]   18   19   20   21   22   23
[5,]   24   25   26   27   28   29
[6,]   30   31   32   33   34   35

> x[c(2,4,6), c(1,3,5)]
     [,1] [,2] [,3]
[1,]    6    8   10
[2,]   18   20   22
[3,]   30   32   34

Python では,

x[[1,3,5], :][:, [0,2,4]]

でようやっと

array([[ 6,  8, 10],
       [18, 20, 22],
       [30, 32, 34]])

x[[1,3,5], [0,2,4]] で得られた array([ 6, 20, 34]) は,目的とした小行列の対角成分だなあ。

R では,x[c(2,4,6), ][, c(1,3,5)]x[c(2,4,6), c(1,3,5)]同じなんだよ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

一難去ってまた一難 (Python)

2020年12月01日 | Python

再度,matplotlib で日本語を使えるようにする Mojave を書いたばかりなのに,である。

Pweave で図を描こうとすると,とんでもないことになる(エラーメッセージがどっと出て,図なんて描かれない)

一番最後の〔原因の)エラーメッセージは,

/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/font_manager.py in get_font(filename, hinting_factor)
   1286     if hinting_factor is None:
   1287         hinting_factor = rcParams['text.hinting_factor']
-> 1288     return _get_font(filename, hinting_factor)
   1289
   1290
TypeError: First argument must be a path or file object reading bytes

出ました。font_manager.py そりゃね,変えたのは font_manager.py だけだからそうなんだろう。

解決策を探索する

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

再度,matplotlib で日本語を使えるようにする (Mojave, Python)

2020年11月30日 | Python

前に,matplotlib で日本語を使えるようにする

を書いたが,その後,描いてみたら,日本語が使えなくなっていた。

その間に何をやったかというと,「Mac OS をバージョンアップして,macOS バージョン 10.14 Mojave にした」ことが原因か。

/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/matplotlib/font_manager.py:1238: UserWarning: findfont: Font family ['IPAMincho'] not found. Falling back to DejaVu Sans.
  (prop.get_family(), self.defaultFamily[fontext]))

というのが出る。

matplotlibrc の IPAMincho を IPAGothic に変えても,相変わらず ['IPAMincho'] not found と言い張るので,1238 行でエラーが起きたという font_manager.py をみてみた。

しばらく,あちこち見たけど,初心に返り先頭にあるコメントを読んでみた。

Experimental support is included for using `fontconfig` on Unix
variant platforms (Linux, OS X, Solaris).  To enable it, set the
constant ``USE_FONTCONFIG`` in this file to ``True``.

と書いてあったので,そうしたら,また,ちゃんと日本語が使えるようになった

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Fisher's exact test(Python)

2020年11月29日 | Python

以前にどこかにも書いたけど,

$ pip install FisherExact

>>> from FisherExact import fisher_exact
>>> fisher_exact([[1,3],[4,2]])
はできるんだけど。2 x 2 より大きい分割表を指定すると segmentation fault で落ちる

以下のようにすれば,R を呼んで,結果は出る

$ pip install rpy2

>>> import numpy as np
>>> import rpy2.robjects.numpy2ri
>>> from rpy2.robjects.packages import importr
>>> rpy2.robjects.numpy2ri.activate()

>>> stats = importr('stats')
>>> m = np.array([[4,4],[4,5],[10,6]]) # 対象とする分割表の定義
>>> res = stats.fisher_test(m)         # fisher.test 起動
>>> print('p-value: {}'.format(res[0][0]))


やっぱ,Python は,ヤダナ

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Pweave と Sweave

2020年11月28日 | Python

TeXShop で,Pweave.engine と Sweave.engine を使い分けていたけど,やはり面倒

自動的にいずれか適切な方を起動するというようにしたほうが何かと便利

Pnw という拡張子を認識しないと愚痴ったけど,むしろそれでよかった

Sweave.engine の最初の方にちょっと書き足した

*.Rnw の先頭行が "%Pweave.Pnw であれば,pweave する。

ms = function(file, makeindex=FALSE, silent=FALSE, deletePdfs=FALSE, deleteWorkfiles=FALSE, ...) {
  Sys.setlocale("LC_ALL", "ja_JP.UTF-8")
  if (grepl("\\.", file) == FALSE) {
    file = paste(file, "Rnw", sep=".")
  }
  cat("Input file:", file, "\n")
  con = file(file, open="r", encoding="utf-8")
  a = readLines(con, 1)
  close(con)
  if (a == "%Pweave.Pnw") {
    system(sprintf("pweave -f tex %s", file))
  } else {
      Sweave(file, encoding="utf-8")
  }
  base = sub(".(R|S)nw", "", file)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

import のやり方

2020年11月27日 | Python

ディレクトリ A に __init__.py と B.py という Python プログラムファイルが あり,その中に C,D という関数が定義されている。

__init__.py があるディレクトリは,Python でいうところの「パッケージ」である。

ディレクトリ A
 __init__.py
 ファイル B.py
  関数 C
  関数 D

C,D をどのようにして呼ぶか。

1. まず ディレクトリ A へ移動してから

1.1. コマンドラインで前もって A へ移動し,python を起動した場合

>>> import B
>>> B.C(1,2)
これは,関数 C の出力です 3
>>> B.D(2,3)
これは,関数 D の出力です 6

>>> from B import C, D
>>> C(9,3)
これは,関数 C の出力です 12
>>> D(9,3)
これは,関数 D の出力です 27
>>>

1.2. ディレクトリ A 以外から python を起動した場合

>>> import os
>>> os.chdir("A のパス指定")
後は同じ

2. どこからも使えるようにする

2.1. path を設定する

>>> import os
>>> import sys
>>> sys.path.append("/Users/foo/Desktop/A/")

>>> import B

>>> B.C(1,3)
これは,関数 C の出力です 4

>>> B.D(4,5)
これは,関数 D の出力です 20

>>> from B import C, D

>>> B.C(10, 20)
これは,関数 C の出力です 30

>>> B.D(11, 34)
これは,関数 D の出力です 374

2.2. 環境変数 PYTHONPATH を設定する

tcsh なら

setenv PYTHONPATH ${PYTHONPATH}:/Users/なんとかかんとか/A/

bash なら

export PYTHONPATH=${PYTHONPATH}:/Users/なんとかかんとか/A/

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村