- 1. 前提条件
- 1.1. 出てきたエラー
- 1.1.1. OpenCVの解像度設定は1度出来なかったからと言って諦めてはいけない(戒め)
- 1.1.2. paizaラーニング「さまざまな長さの配列の和 Python3編」
- 1.1.3. Python-画像解析: Contact Analysisによる溶解過程解析
- 1.1.4. 自然数ローマ数字変換 Python3
- 1.1.5. 40代おっさんFastAPI、MongoDB連携メモ②
- 1.1.6. 40代おっさんFastAPI、MongoDB連携メモ①
- 1.1.7. python3、mpmathを用いて、自然対数の底eを求めるテスト
- 1.1.8. Pythonチートシート – List型の使い方一覧
- 1.1.9. Linux Python3で、真の乱数を使う。
- 1.1.10. 配列の要素数、配列の要素の表示、文字列分割
- 1.1.11. ガウス・ルジャンドル法によるπの算出 python3
- 1.1.12. python3、mpmathを使った、サンクトペテルブルグのパラドックスの独自研究
- 1.1.13. __hash__の戻り値が0固定のオブジェクトを、dictのキーにしてみる
- 1.1.14. 手検出やジェスチャー認識で PC を操作する方法
- 1.1.15. jax/flaxのインストール時のトラブルメモ
- 1.1. 出てきたエラー
Pythonにおける組み込み型の種類
# はじめに
近年の静的型付け言語の流行に伴い、Pythonでコードを書く際に静的型付け言語のように型安全な書き方を記載することが求められるようになってきました。実際にPython3においてversionが上がる度に型ヒントに関する機能が充実するようになってきました。
今回はPythonにおける型の種類をまとめました。
※因みにPythonはすべてがオブジェクトなので、Pythonにおける型とはオブジェクトの種類(type)のこと。ここではtype()の戻り値のクラスを型と呼びます。Python実行環境は Python 3.9.6
# Pythonに備わっている組み込み型(Built-in Types)
組み込み型は主に下記が存在します。(公式ドキュメントから抜粋)
1, 数値型(整数、浮動小数、複素数)
2, シーケンス(リスト、タプル、rangeオブジェクト)
3, テキストシーケンス(文字列)
4, 集合型(set, frozenset)
5, マッピング(辞書)
6, バイナリシーケンス
7, クラス、インスタンス、および例外
※6,7は今回は扱わない。## 1,
【python】行列で連立一次方程式を解く
## 概要
pythonで行列計算をすることが多いので、備忘録として残しておくことにいたしました。まだまだ至らないところがたくさんあると思いますが、皆様何卒よろしくお願い申し上げます。
## 環境
macOS 13.1
conda 22.9.0
Python 3.9.13
numpy 1.21.5
### 単位行列の積
まず単位行列を用いて、正しく計算が行われているかを確認してみます。“`python
import numpy as np
mat_1 = np.matrix([[0, 1], [2, 3]])
i = np.eye(2) #iは単位行列mat_2 = np.dot(mat_1,i)
mat_3 = np.dot(i,mat_1)print(mat_2)
print(mat_3)”’
実行結果
[[0 1]
[2 3]]
[[0 1]
[2 3]]
”’
“`:::note info
単位行列をかけているので、mat_2,mat_3ともにmat_1と等しくなっていることが確認できます。
:::### 逆行列を求める
次に逆行列につい
〈Kivy〉シングルタップ・ダブルタップで別の動作をするボタンを作る
# 目標
こんなふうに, シングルタップとダブルタップで別の動作をするボタンを作成する.
具体的には, シングルタップで「+1」, ダブルタップで「数字を 0 に戻す」動作を行うボタンを実装する.# サンプルコード(ダブルタップ実装前)
左のボタンを押すと表示された数値に +1, 右のボタンを押すと表示された数値に +2 するシンプルなボタン.
これを修正してダブルタップ処理を追加する.
以下にコードを記載する.## 1. double_t
InfluxDB v2: Python Client の使い方 (時系列データ)
## 準備
トークンを調べる“`bash
influx auth list
“`バケットの作成 (dbtest というバケットを作成)
“`bash
influx bucket create -n dbtest -r 72h
“`バケットの削除
“`bash
influx bucket delete -n dbtest
“`バケットの一覧
“`bash
influx bucket list
“`## データの書き込み
“`py:write_temperature.py
#! /usr/bin/python
#
# write_temperature.py
#
# Jan/19/2023
#
# ——————————————————————
import sys
import json
import requests
import time
# —————————————————
Raspberry PI上のPython-slimコンテナ(Debianベース)でrustc依存のパッケージ構築に苦労した話
初投稿です.今後よろしくお願いします.
ある研究案件でRaspberry PI上のPythonのslimコンテナ(執筆時python:3.9-slim)にpip経由で色々入れようとしたところいろいろ躓いたのでメモ
Debianのaptで入るrustが古かったり,Dockerfile内でのPATH変数の更新などで一苦労しました
最後に書きますが,今のところこの方法じゃない方がよいかもです.前提条件
OS: Rasbian( on Raspberrypi4 )
Docker及びDocker-composeをapt経由でインストール
Dockerfile内にpip経由でbcryptを含むいくつか(主にFlask関係)をインストールする文を書いた
ベースコンテナはpython:3.9-slim出てきたエラー
error: can’t find Rust compiler
でbcryptパッケージのインストールがこけます
Rustのコンパイラが見つからないようです
OpenCVの解像度設定は1度出来なかったからと言って諦めてはいけない(戒め)
# 背景
産業用のMV-CE050-30UCというUSB3のカメラでOpenCVによる画像処理を行いたかった。
デフォルトで対応していないと思い込んでいろいろ試行錯誤した後、
非常に簡単に対応させる手順が用意されていた。
なんとかOpenCVで画像が出て喜んだものの解像度が640 x 480。最大解像度まで上げたい。
メーカー標準のビューワーやGraphEditでは解像度変更は可能だった。
最大解像度は2592 x 1944、設定間隔は横16、縦2ずつの模様。
設定ファイル的なものは見つからず、どうやらプログラムから変更するしかないようだが・・・# 実行環境
| モジュール | Ver | 備考 |
|:-:|:-:|:-:|
| python | 3.10.0 | |
| opencv-python | 4.7.0.68 | |
| numpy | 1.24.1 | opencv-pythonインストール時に自動でインストールされたもの |
| MVS | 3.1.0 |MV-CE050-30UCのデバイスドライバのインストールとユーティリティ|#
paizaラーニング「さまざまな長さの配列の和 Python3編」
https://paiza.jp/works/mondai/double_roop_problems/double_roop_problems__various_row_sum
この問題、結構考えたのですが、解りませんでした。
#### 解答例
“`Python:Python3
n = int(input())for _ in range(n):
k_a = [int(i) for i in input().split()]
k = k_a[0]
a = k_a[1:]
s = 0
for i in range(k):
s += a[i]
print(s)
“`
Python-画像解析: Contact Analysisによる溶解過程解析
# はじめに
“Contact Analysis”を用いて物質溶解過程を解析する。
実装にはPython3のOpenCV4を用いる。本稿では、牛乳にインスタントコーヒーを溶かす過程を解析する。
より実用に近い解析は以下の論文を参照されたい。
– H. Barrington et.al., Org. Process Res. Dev. 2022, 26, 11, 3073–3088. [DOI](https://doi.org/10.1021/acs.oprd.2c00216)# 大まかな流れ
1. 閾値を決めて画像を2値化
2. 白黒二つの領域の境界面の割合を算出# Pythonコード
### 流れ
“`
## インポート
import cv2
import matplotlib.pyplot as plt
“`“`
## 画像の読み込み
filepath = “./demo/coffee1.png”
img = cv2.imread(filepath, 0) #グレースケールで読み込み## 可視化
plt.imshow(img)
plt.show()
“`
自然数ローマ数字変換 Python3
自然数とローマ数字の変換をします。
ローマ数字から自然数への変換の関数はエラーチェックをしませんが、正しいローマ数字を入力すれば正しく変換されます。試作品Ver0.8です。
“`romanumber.py
#!/usr/bin/python3
import sysTABINT=[1000,900,500,400,100,90,50,40,10,9,5,4,1]
TABROMA=[“M”,”CM”,”D”,”CD”,”C”,”XC”,”L”,”XL”,”X”,”IX”,”V”,”IV”,”I”]def toint(s):
a=0
i=0
while(s):
if (s.startswith(TABROMA[i])):
s=s.replace(TABROMA[i],”,1)
a+=TABINT[i]
else:
i+=1
if (i==len(TABROMA)):
break
return(a)def toroman(a):
s=””
i=0
while(a!
40代おっさんFastAPI、MongoDB連携メモ②
## 本記事について
この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。## タスクの一覧を取得する
### database.py
“`python
async def db_get_todos() -> list: # 一覧が返ってくるようにlist型を定義
todos = [] # MongoDBから返ってくるデータを受ける配列
# タスクの一覧を受け取る処理
for todo in await collection_todo.find().to_list(length=100): # lengthで最大件数を定義
todos.append(todo_serializer(todo)) # for文で展開した物をtodosに格納
return todos
“`– `collection_todo.find()`motorのメソッド(‘find()’)
– ‘find()’はmotorのインスタンス
40代おっさんFastAPI、MongoDB連携メモ①
## 本記事について
この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。## 環境ファイルを作る
プロジェクトの直下に`.env`を作る
次にMongoDBからConnectのパスをコピー
``部分を自分で作ったものに変える “`
MONGO_API_KEY=mongodb+srv://XXXXXXXXXXXXX
“`次にプロジェクトの直下に`database.py`を作る
もう1つ`schemas.py`を作る### database.py
こちらにはMongoDBと連携する処理を書く
“`python
from decouple import config
from typing import Union # 選択肢が2つ以上の場合に使える
import motor.motor_asyncio # こちらでMongoDB連携のために使うMONGO_API_KEY = config(‘MONGO_API_KEY’)
python3、mpmathを用いて、自然対数の底eを求めるテスト
python3、mpmathを用いて、自然対数の底eを、求める
“`e.py
#!/usr/bin/python3
import mpmath
mpmath.mp.dps=10000kaijou = 1
number = 1000
napier = mpmath.mpf(‘1.0’)for i in range(1,number+1):
kaijou *= i;
napier += mpmath.mpf(‘1.0’) / kaijou;print(“計算結果 e =”,end=”)
print(napier)
print(“mpmath.e =”,end=”)
print(mpmath.e)
“`
Pythonチートシート – List型の使い方一覧
仕事や学習の時に役立つちょっとしたチートシートを作ってみることにしました。今回は個人的にPythonの学習で一番使う機会の多い、List型の使い方をまとめてみました。
## コレクションとコンテナについて
データ型の中でも、複数の値を束ねるための仕組みをコレクション・コンテナと呼びます。Pythonにおけるコンテナは、シーケンス・セット・ディクショナリーの3型があります。
– シーケンス – 順に並んだ値を扱う。中身の重複・異なる型をあつかえる。いわゆる配列
– セット – 順序を持たず、値の重複ができない。数学の集合に近い
– ディクショナリー – キー・値の仕組みで要素を管理する。キーは重複不可・値はOK。## シーケンスについて
シーケンス型にはlist, tuple, range等の型があります。シーケンス型の要素には、インデックス値を使ってアクセスすることができます。listが扱えるのはイテラブルな型で、`list(iterable)`という宣言でインスタンス化することができます。他にもリスト内包表記や、`sorted(), split()`といったメソッドがlis
Linux Python3で、真の乱数を使う。
Linux Python3で、真の乱数を使う
コンピュータで使える乱数は、2種類あり、周期をもつ疑似乱数と、
統計論的に正しい真の乱数があります。python3では、乱数の利用は主にrandomモジュールを使います。ですが、これは、
疑似乱数を発生するもので、真の乱数ではありません。randomモジュールのrandom.seed()は、乱数発生機を初期化しますが、
osが乱数のソースを提供してくれている場合はそれを、
してくれていない場合はシステム時刻を乱数の種に使います。Linuxでは、random.seed()で参照される乱数のソースが
/dev/urandom(疑似乱数デバイス)なので、真の乱数ではありません。また、Linuxは、/dev/randomを提供していて、これを読み出すと、環境ノイズからの
真の乱数を得ることができます。なので、これを乱数の種に使いましょう。乱数シードを真の乱数で初期化すると、そのモジュールで、以降それが利用されるので、
後々便利です。ですが、なお、カーネルのバージョンが、5.6.0に満たない場合、
/dev/randomを使
配列の要素数、配列の要素の表示、文字列分割
Python3で配列の要素数、配列の要素の表示、文字列分割のプログラムを実装しました
“`Python3
str = “Hello paiza”
#スペース区切りの文字列を分割する
array1 = str.split(‘ ‘)
#配列の要素数を取得する
num = len(array1)
#ループ文で表示する
for i in range(num):
print(array1[i])
“`split関数で文字列を分割して配列に格納します。
len関数を使って配列の要素数を取得します
for文で配列の要素順に表示します。
ガウス・ルジャンドル法によるπの算出 python3
ガウス・ルジャンドル法によるπの算出です。
rubyで書かれたサンプルプログラムをpythonに移植しました。
mpmathの計算桁数を1000にしてます。
πの近似値を一桁ずつ延々と無限ループで出力しますが、精度は、10000桁までチェックしました。“`pi.py
#!/usr/bin/python3
import mpmath
import sys
k, a, b, a1, b1 = 2, 4, 1, 12, 4
mpmath.mp.dps=1000f=0
while(True):
# Next approximation
p, q, k = k*k, 2*k+1, k+1
a, b, a1, b1 = a1, b1, p*a+q*a1, p*b+q*b1
# Print common digits
d = a / b
d1 = a1 / b1
while(d == d1):
print (int(d),end=”)
sys.stdout.flush()
if f==0:
print(“.”,end=”)
python3、mpmathを使った、サンクトペテルブルグのパラドックスの独自研究
コインを表が出るまで投げ続け、投げた回数をNとすると、
2^(N-1)円もらえるとするゲームにおいて、期待値を計算すると、
無限大に発散してしまう。
W=Σk=1,∞(1/2^k・2^(k-1))=∞これは、直感と反するので、サンクトペテルスブルグのパラドックスと呼ばれる。
一旦、コインを投げる回数の期待値Sを求め、
それから賞金の期待値(もどき)μを算出する方法(方法1)を取ってみるS=Σk=1,∞ (1/2^k)=2
S=2なので、μ=2^(S-1)=2
故に、答えは2である。と、いうのは誤っている。(よくある間違い)
一般に、期待値において、f(g(x))=g(f(x))は成り立たないので、
一旦、コインを投げる回数の期待値を求め、それから賞金の期待値(もどき)
を算出するのは誤っている。
しかし、これのどこが間違っているのかは解らない。
意味論的には合ってるが、数学的には間違っているウイリアム・フェラーも標本抽出で算出したが、期待値無限大が正解である。
ゲームの回数が有限に限られるならば、期待値は遥かに小さな値に収束する
__hash__の戻り値が0固定のオブジェクトを、dictのキーにしてみる
Pythonのdictのオープンアドレス法のハッシュテーブルで実装されており、GetとSetの計算量は O(1) である。
(Pythonのdictの実装は[この](http://dsas.blog.klab.org/archives/python-dict-internal.html)記事が詳しい)
しかし、O(1) なのは異なるキーから同じハッシュ値が頻繁に生成されないことが前提である。
ここでは、全てのキーから同じハッシュ値が生成する最悪ケースで実験してみる。“`python
import timeclass BadKey:
name = ‘bad’def __init__(self, key):
self.key = keydef __hash__(self):
return 0def __eq__(self, o):
return self.key == o.keydef __repr__(self):
return self.keycla
手検出やジェスチャー認識で PC を操作する方法
手検出やジェスチャー認識で PC を操作することは多くの方が想像するところではないでしょうか?この場合、HID (Human Interface Device)として BLE Peripheral の実装を行いたくなります。しかしながら、私自身のように普段は別の分野の業務に従事する方や、こうした話が持ち込まれる機械学習エンジニアにとって突然 HID Over GATT を実装を行うのは骨が折れることだと思います。(マイコン向けの micro python などで記述された実装は簡単にヒットするが、デスクトップ環境の実装の記事が少なく、dbus-api として提供されるようになった bluez の背景を追うことや SerialPortProfile (SPP) の存在が私を混乱させた。)
私自身は当時 tech demo のために設けられた一週間のうちに実現できず、その後1年ほど少しずつ情報を集めて BLE マウスのエミュレートの実現に至っています。この話は別案件においても応用が効くように思うので、私の実装の公開を行い、この記事では実装を修正するための要所を記載しようと思います。(去年
jax/flaxのインストール時のトラブルメモ
# インストール
GPUを使う時はpipインストール時に指定しなければいけない
“`
pip install –upgrade “jax[cuda]” -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
“`実際にはcudnnのバージョンに合わせてバージョン指定したほうがいい(後述)
“`
pip install “jax[cuda11_cudnn86]” -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
pip install “jax[cuda11_cudnn82]” -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
“`# バージョンについて
cudnnバージョンは環境のcudnnのメジャーバージョンは合わせなければいけない
マイナーバージョンは環境のcudnnよりも古いjaxをインストー