どのような処理をしたいのか見えてこないため、とりあえずおかしい点について述べます。
-
- 形状 (2, 1) の行列 v と形状 (2, 1) の行列 w にたいして、numpy.dot() を呼ぶと行列積になるので、(2, 1) の行列と (2, 1) の行列の行列積は計算できません。ベクトルであれば、1次元配列で定義してください。
python
1v = np.ones(2, np.float32)
2w = np.ones(2, np.float32)
3
4ret = np.dot(w, v)
5print(ret)
python
1i = w[:, 0]
2j = w[0, :]
この変数 i, j
は下記で再代入されるので、意味がありません。
python
1for i in range(-64, 63):
2 for j in range(-64, 63):
np.dot(w, v)
の結果を X[i, j] に代入したいのであれば、以下のようにするべきです。
これは値を [0, 255] の範囲外のものがあれば、[0, 255] にするという関数であって、正規化を行う関数ではありません。正規化を行う関数は numpy にないので、自分で実装する必要があります。
python
1def array_to_img(arr):
2 # [0, 1] にする
3 arr = arr - arr.min()
4 if arr.max() != arr.min():
5 arr /= (arr.max() - arr.min())
6 # [0, 255] にする
7 arr = (arr * 255).astype("uint8")
8
9 return arr
10
11arr = np.random.randn(5, 5)
12img = array_to_img(arr)
13print(img)
画像の大きさが (128, 128) ならば、有効なインデックスの範囲は i, j = 0, 1, ..., 127 です。
なので、range(-64, 63) なら IndexError になります。
python
1for i in range(-64, 63):
2 for j in range(-64, 63):
3 X[i][j] # エラー
徐々に色がうっすらと変わってくる画像であると考えています。
ベクトル [1, 1] とベクトル [1, 1] の内積は2なので、すべての要素が2なら真っ黒の画像になるのではないでしょうか?
追記
python
1import cv2
2import matplotlib.pyplot as plt
3import numpy as np
4
5# 全て0の128行列128列Xを作成#
6X = np.zeros([128, 128], np.float32)
7# 全て1の1行2列vを作成#
8v = np.ones(2, np.float32)
9# 全て1の1行2列vを作成#
10w = np.ones(2, np.float32)
11# w=[i][j]とした場合、forでiとjそれぞれ-64から63まで1づつ変化させwとvの内積をX[i,j]に代入#
12for i in range(128):
13 for j in range(128):
14 X[i, j] = np.dot(v, w)
15
16def array_to_img(arr):
17 # [0, 1] にする
18 arr = arr - arr.min()
19 if arr.max() != arr.min():
20 arr /= arr.max() - arr.min()
21 # [0, 255] にする
22 arr = (arr * 255).astype("uint8")
23
24 return arr
25
26
27img = array_to_img(X)
28
29plt.imshow(img, cmap="gray")
30plt.show()