2023年2月 4日 (土)

[Python]行列の掛け算

dotメソッドを使う。最後の例のとおり、掛けられる行列の列数と掛ける行列の行数が同じでなければ計算することはできない。

>>> mx1 = np.array([[-1, 0, 3], [8, 1, -5]])
>>> mx2 = np.array([[3, 4, 0], [-2, 1, 2]])
>>> mx3 = np.array([[4, -3, 7], [2, 0, -1], [1, 5, 0]])
>>> print(mx1)
[[-1 0 3]
[ 8 1 -5]]
>>> print(mx2)
[[ 3 4 0]
[-2 1 2]]
>>> print(mx3)
[[ 4 -3 7]
[ 2 0 -1]
[ 1 5 0]]
>>> np.dot(mx1, mx3)
array([[ -1, 18, -7],
[ 29, -49, 55]])
>>> np.dot(mx2, mx3)
array([[ 20, -9, 17],
[ -4, 16, -15]])
>>> np.dot(mx1, mx2)
Traceback (most recent call last):
File "", line 1, in
File "<__array_function__ internals>", line 5, in dot
ValueError: shapes (2,3) and (2,3) not aligned: 3 (dim 1) != 2 (dim 0)

[R]行列式を求める

det関数を使う。

> mx <- matrix(3, 1, 1)
> print(mx)
[,1]
[1,] 3
> det(mx)
[1] 3
> mx <- matrix(1:4, 2, 2, byrow = TRUE)
> print(mx)
[,1] [,2]
[1,] 1 2
[2,] 3 4
> det(mx)
[1] -2
> mx <- matrix(c(0, -4, 0, -1, 3, 6, -2, 0, 2, 1, 3, 0, -1, 5, -1, 2), 4, 4)
> print(mx)
[,1] [,2] [,3] [,4]
[1,] 0 3 2 -1
[2,] -4 6 1 5
[3,] 0 -2 3 -1
[4,] -1 0 0 2
> det(mx)
[1] 28

2023年2月 3日 (金)

[R]数列を作る

seqコマンドを使う。引数は1~3つ与えることができ、それぞれ以下のようになる。最後の例のとおり、最後に公差を加えて末項に一致しない場合は、その1つ前の項までが作成される。

  • seq(初項)
  • seq(初項, 末項) ※公差は1
  • seq(初項, 末項, 公差) ※末項に届かないときはその1つ前の項まで
> seq(3)
[1] 1 2 3
> seq(2, 5)
[1] 2 3 4 5
> seq(3, 12, 4)
[1] 3 7 11

負数や実数の指定も可能。

> seq(-1, -11, -2)
[1] -1 -3 -5 -7 -9 -11
> seq(1.2, 2.8, 0.4)
[1] 1.2 1.6 2.0 2.4 2.8

2023年2月 2日 (木)

[R]行列の掛け算

%*% 演算子を使う。最後の例のとおり、掛けられる行列の列数と掛ける行列の行数が同じでなければ計算することはできない。

> mx1 <- matrix(c(-1, 8, 0, 1, 3, -5), 2, 3)
> mx2 <- matrix(c(3, -2, 4, 1, 0, 2), 2, 3)
> mx3 <- matrix(c(4, 2, 1, -3, 0, 5, 7, -1, 0), 3, 3)
> print(mx1)
[,1] [,2] [,3]
[1,] -1 0 3
[2,] 8 1 -5
> print(mx2)
[,1] [,2] [,3]
[1,] 3 4 0
[2,] -2 1 2
> print(mx3)
[,1] [,2] [,3]
[1,] 4 -3 7
[2,] 2 0 -1
[3,] 1 5 0
> mx1 %*% mx3
[,1] [,2] [,3]
[1,] -1 18 -7
[2,] 29 -49 55
> mx2 %*% mx3
[,1] [,2] [,3]
[1,] 20 -9 17
[2,] -4 16 -15
> mx1 %*% mx2
mx1 %*% mx2 でエラー: 適切な引数ではありません

2023年1月31日 (火)

[Visual Basic]各プロジェクトで自動作成されるソースファイルの文字コードと改行コード

Visual Basic 2019の新規プロジェクトで最初に作成されたForm1.vbを、PowerShellのFormat-Hexコマンドレットでダンプしてみる。

PS > Get-Content .\Form1.vb
Public Class Form1
End Class
PS > Format-Hex .\Form1.vb
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 EF BB BF 50 75 62 6C 69 63 20 43 6C 61 73 73 20 Public Class
00000010 46 6F 72 6D 31 0D 0A 0D 0A 45 6E 64 20 43 6C 61 Form1....End Cla
00000020 73 73 0D 0A ss..

見てのとおり、先頭にバイトオーダーマークであるEF BB BFが記述されており、1バイト文字(「P」や「U」)は1バイトで記述されていることから、文字コードはBOM付きUTF-8であることがわかる。

改行コードは 0D+0A であるため、CR+LF である。

2023年1月29日 (日)

[R]書式を指定して文字列型ベクトルを日付型ベクトルに変換する

strptime関数を使う。戻り値はPOSIXlt型(時刻とタイムゾーンを持つ日付型で、実態は秒単位の整数型)。

> s <- c("2001-02-03", "2002-04-05")
> strptime(s, "%Y-%m-%d")
[1] "2001-02-03 JST" "2002-04-05 JST"
> s <- c("2001/02/03", "2002/04/05")
> strptime(s, "%Y/%m/%d")
[1] "2001-02-03 JST" "2002-04-05 JST"
> dt <- strptime(s, "%Y/%m/%d")
> class(dt)
[1] "POSIXlt" "POSIXt"

POSIXlt型のため、時刻も扱える(タイムゾーンも)。

> s <- c("2001-02-03T12:24:56", "2002-04-05T01:02:03")
> strptime(s, "%Y-%m-%dT%H:%M:%S")
[1] "2001-02-03 12:24:56 JST" "2002-04-05 01:02:03 JST"

POSIXlt型の実態は秒単位の整数型のため、整数で演算をすると、以下のような結果になる。

> dt <- strptime(s, "%Y-%m-%dT%H:%M:%S")
> dt
[1] "2001-02-03 12:34:56 JST" "2002-04-05 01:02:03 JST"
> dt + 3
[1] "2001-02-03 12:34:59 JST" "2002-04-05 01:02:06 JST"

書式はstrptimeに書かれている。

> ?strptime

2023年1月28日 (土)

[R]分散と標準偏差(「まずはこの一冊から 意味が分かる統計学」(ペレ出版)、pp.27-28)

p.27の観測値をファイルtable_p027.csvに保存しておく。

> dtf <- read.csv("table_p027.csv")
> x <- dtf$x
> n <- length(x)
> m <- mean(x)
> v <- sum((x - m) ^ 2) / n
> s <- sqrt(v)
> cat(sprintf("分散 = %f\n", v))
分散 = 163.700000
> cat(sprintf("標準偏差 = %f\n", s))
標準偏差 = 12.794530

2023年1月27日 (金)

[R]共分散(「まずはこの一冊から 意味が分かる統計解析」(ペレ出版)、p.152)

以下のp.152の表の数値をファイルtable_p214.csvに保存して、カレントディレクトリに置いておく。

 i,     h,    w
1, 147.9, 41.7
2, 163.5, 60.2
3, 159.8, 47.0
4, 155.1, 53.2
5, 163.3, 48.3
6, 158.7, 55.2
7, 172.0, 58.5
8, 161.2, 49.0
9, 153.9, 46.7
10, 161.6, 52.5

計算する。

> dtf <- read.csv("table_p214.csv")
> n <- nrow(dtf)
> h <- dtf$h
> w <- dtf$w
> mh <- mean(h)
> mw <- mean(w)
> sxy <- sum((h - mh) * (w - mw)) / n
> spxy <- sum((h - mh) * (w - mw)) / (n - 1)
> cat(sprintf("身長の平均 = %f\n", mh))
身長の平均 = 159.700000
> cat(sprintf("体重の平均 = %f\n", mw))
体重の平均 = 51.230000
> cat(sprintf("sxy = %f\n", sxy))
sxy = 23.730000
> cat(sprintf("cov関数の結果 = %f\n", cov(h, w)))
cov関数の結果 = 26.366667
> cat(sprintf("s'xy = %f\n", spxy))
s'xy = 26.366667

2023年1月26日 (木)

[R]偏差値(「まずはこの一冊から 意味が分かる統計解析」(ペレ出版)、p.47)

以下のp.47の表の数値をファイルtable_p047.csvに保存して、カレントディレクトリに置いておく。

i,  x
1, 61
2, 59
3, 60
4, 67
5, 53

計算する。

> dtf <- read.csv("table_p047.csv")
> n <- nrow(dtf)
> x <- dtf$x
> mx <- mean(x)
> s2 <- sum((x - mx) ^ 2) / n
> s <- sqrt(s2)
> z <- 50 + 10 * (x - mx) / s
> cat(sprintf("平均 %f\n", mx))
平均 60.000000
> cat(sprintf("標準偏差 %f\n", s))
標準偏差 4.472136
> cat("番号 点数 偏差値\n")
番号 点数 偏差値
> for (i in 1:n) {
+ cat(sprintf("%d %d %.1f\n", i, x[i], z[i]))
+ }
1 61 52.2
2 59 47.8
3 60 50.0
4 67 65.7
5 53 34.3

2023年1月22日 (日)

[R]平均(「まずはこの一冊から 意味が分かる統計学」(ペレ出版)、p.27)

以下の観測値をファイルtable_p027.csvに保存しておく。

 i,  x
1, 43
2, 47
3, 52
4, 52
5, 54
6, 61
7, 67
8, 67
9, 68
10, 69
11, 70
12, 71
13, 71
14, 73
15, 76
16, 78
17, 82
18, 84
19, 84
20, 91

計算する。

> dtf <- read.csv("table_p027.csv")
> x <- dtf$x
> m <- mean(x)
> cat(sprintf("%f\n", m))
68.000000

«[Python]固有値、固有ベクトルを求める

無料ブログはココログ