« 2025年4月 | トップページ | 2025年6月 »

2025年5月26日 (月)

[R]勾配ベクトルを求める

numDerivパッケージのjacobian関数を使う。第一引数に目的関数を、第二引数に変数の値をベクトルで与える。

> library(numDeriv)
> f1 <- function(x) {6 - 0.1 * (x[1] - 5) ^ 2} * {6 - 0.04 * (x[2] - 5) ^ 2}
> jacobian(f1, c(8.25, 5.25))
[,1] [,2]
[1,] -3.898375 -0.098875
> f2 <- function(x) 2 * x[1] - 4 * x[2] + x[1] ^ 2 + 2 * x[2] ^ 2 + 2 * x[1] * x[2]
> jacobian(f2, c(1, 1))
[,1] [,2]
[1,] 6 2

2025年5月25日 (日)

[R]ヘッセ行列を求める

numDerivパッケージのhessian関数を使う。第一引数に目的関数を、第二引数に変数の値をベクトルで与える。

> library(numDeriv)
> f1 <- function(x) x[1] ^ 2 + 4 * x[2] ^ 2
> hessian(f1, c(0, 0))
[,1] [,2]
[1,] 2.000000e+00 -3.308722e-16
[2,] -3.308722e-16 8.000000e+00
> f2 <- function(x) x[1] ^ 2 + 2 * x[2] ^ 2
> hessian(f2, c(0, 0))
[,1] [,2]
[1,] 2.000000e+00 3.308722e-16
[2,] 3.308722e-16 4.000000e+00
> f3 <- function(x) 2 * x[1] - 4 * x[2] + x[1] ^ 2 + 2 * x[2] ^ 2 + 2 * x[1] * x[2]
> hessian(f3, c(0, 0))
[,1] [,2]
[1,] 2 2
[2,] 2 4

2025年5月23日 (金)

[R]指定した複数の列を基準にして2つのデータフレーム(tibble)が結合できるか否か調べる

dplyrパッケージのjoin_by関数に複数の結合の条件を指定してsemi_join関数、anti_join関数を使う。結合の条件を,(コンマ)で区切る。以下は、あらかじめ用意した二つのデータフレームを、結合できるか否か調べた例。

> dtf1
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル キャストリス
3 miHoYo 崩壊:スターレイル 帰望の流離人
4 miHoYo ゼンレスゾーンゼロ リン
5 KURO GAMES 鳴潮 カンタレラ
> dtf2
sakuhin kyara seiyu
1 崩壊3rd ヴィタ 日笠陽子
2 崩壊3rd セナディア 鈴木みのり
3 崩壊:スターレイル 帰望の流離人 高田憂希
4 ゼンレスゾーンゼロ アストラ 遠藤綾
5 鳴潮 カンタレラ 中原麻衣
> library(dplyr)

semi_join関数は、右側に指定の列の値が一致する行がある左側の行を返す。inner_join関数と動作は似ているが、semi_join関数は、結合はせずに結合可能な左側の行だけを返す。

> dtf1 |> inner_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
3 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> dtf1 |> semi_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル 帰望の流離人
3 KURO GAMES 鳴潮 カンタレラ

anti_join関数は、右側に指定の列の値が一致する行がない左側の行を返す。left_join関数では無理矢理結合されて列にNAが代入された行(以下の2,4行目)も返されるが、anti_join関数は結合はせずに左側の行だけを返す。

> dtf1 |> left_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル キャストリス <NA>
3 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
4 miHoYo ゼンレスゾーンゼロ リン <NA>
5 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> dtf1 |> anti_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character
1 miHoYo 崩壊:スターレイル キャストリス
2 miHoYo ゼンレスゾーンゼロ リン

2025年5月22日 (木)

[R]指定した複数の列を基準にして二つのデータフレーム(tibble)を結合する

dplyrパッケージのjoin_by関数に複数の結合の条件を指定して~_join関数を使う。結合の条件は,(コンマ)で区切る。以下は、あらかじめ用意した二つのデータフレームを、左外部結合、右外部結合、完全外部結合、内部結合した例。

> dtf1
company title character
1 miHoYo 崩壊3rd セナディア
2 miHoYo 崩壊:スターレイル キャストリス
3 miHoYo 崩壊:スターレイル 帰望の流離人
4 miHoYo ゼンレスゾーンゼロ リン
5 KURO GAMES 鳴潮 カンタレラ
> dtf2
sakuhin kyara seiyu
1 崩壊3rd ヴィタ 日笠陽子
2 崩壊3rd セナディア 鈴木みのり
3 崩壊:スターレイル 帰望の流離人 高田憂希
4 ゼンレスゾーンゼロ アストラ 遠藤綾
5 鳴潮 カンタレラ 中原麻衣
> library(dplyr)
> # 左外部結合
> dtf1 |> left_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル キャストリス <NA>
3 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
4 miHoYo ゼンレスゾーンゼロ リン <NA>
5 KURO GAMES 鳴潮 カンタレラ 中原麻衣
> # 右外部結合
> dtf1 |> right_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
3 KURO GAMES 鳴潮 カンタレラ 中原麻衣
4 <NA> 崩壊3rd ヴィタ 日笠陽子
5 <NA> ゼンレスゾーンゼロ アストラ 遠藤綾
> # 完全外部結合
> dtf1 |> full_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル キャストリス <NA>
3 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
4 miHoYo ゼンレスゾーンゼロ リン <NA>
5 KURO GAMES 鳴潮 カンタレラ 中原麻衣
6 <NA> 崩壊3rd ヴィタ 日笠陽子
7 <NA> ゼンレスゾーンゼロ アストラ 遠藤綾
> # 内部結合
> dtf1 |> inner_join(dtf2, by = join_by(title == sakuhin, character == kyara))
company title character seiyu
1 miHoYo 崩壊3rd セナディア 鈴木みのり
2 miHoYo 崩壊:スターレイル 帰望の流離人 高田憂希
3 KURO GAMES 鳴潮 カンタレラ 中原麻衣

2025年5月15日 (木)

[Python]リストから条件に一致する要素を抽出する

リスト内包表記のif節を使う。戻り値はリストで、条件に一致する要素がない場合は、空のリストを返す。以下の例のとおり、if節には式は一つしか書くことはできない。

>>> ns = [2 ** n for n in range(0, 9)]
>>> print(ns)
[1, 2, 4, 8, 16, 32, 64, 128, 256]
>>> [n for n in ns if n > 100]
[128, 256]
>>> [n for n in ns if n > 1000]
[]
>>> len([n for n in ns if n > 100])
2
>>> len([n for n in ns if n > 1000])
0
>>> [s for s in ss if s == '瀬戸麻沙美']
['瀬戸麻沙美']
>>> [s for s in ss if (s == '鈴木みのり' || s == 'のぐちゆり')]
File "", line 1
[s for s in ss if (s == '鈴木みのり' || s == 'のぐちゆり')]
^
SyntaxError: invalid syntax
>>> import re
>>> [s for s in ss if re.search('(鈴木みのり|のぐちゆり)', s)]
['鈴木みのり', '鈴木みのり', 'のぐちゆり']
>>> [s for s in ss if re.search('美', s)]
['瀬戸麻沙美', '和多田美咲']

2025年5月 8日 (木)

[Python]特定の文字列で始まる(始まらない)文字列を抽出する

正規表現で^記号は文字列の先頭を表すため、これを正規表現パターンに利用する。以下の例では、複数の文字列からなるリストから、リスト内包表記を使用して、指定した正規表現パターンにマッチする(しない)要素を取り出している。

>>> import re
>>> ss = ['石見舞菜香', '鈴木みのり', '瀬戸麻沙美', 'のぐちゆり', '和多田美咲']
>>> # 「美」で終わる氏名
>>> [s for s in ss if re.search('美$', s)]
['瀬戸麻沙美']
>>> # 「美」で終わらない氏名
>>> [s for s in ss if not re.search('美$', s)]
['石見舞菜香', '鈴木みのり', 'のぐちゆり', '和多田美咲']
>>> # 「美」を含むが「美」で終わらない氏名
>>> [s for s in ss if re.search('美.+$', s)]
['和多田美咲']

ルックアラウンド式(lookaround expression)を使うこともできる。

>>> # 「美」で終わる氏名 ※肯定的な後読み
>>> [s for s in ss if re.search('(?<=美)$', s)]
['瀬戸麻沙美']
>>> # 「美」で終わらない氏名 ※否定的な後読み
>>> [s for s in ss if re.search('(?<!美)$', s)]
['石見舞菜香', '鈴木みのり', 'のぐちゆり', '和多田美咲']

ルックアラウンド式については、以下のページの「Lookaround の概要」を参照のこと。

« 2025年4月 | トップページ | 2025年6月 »

無料ブログはココログ

■■

■■■