概要
pythonにおける小技を自分用にまとめておく
目次
- 空のデータフレーム作成
- np.whereを用いた条件を満たす行列要素の抽出
- リストの中から重み(確率)付けしてランダムに抽出
空のデータフレーム作成
空のデータフレームを作成し,リストを格納した.
df = pd.DataFrame()
a = [0, 1, 2]
df['a'] = a #リスト格納
print(df)
>>> a
0 0
1 1
2 2
Jupyter Notebookで実装している場合,以下によってDataFrameを全て表示することが可能である.
pd.set_option('display.max_rows', None) #indexに相当
pd.set_option('display.max_columns', None)
numpyのスライスの注意点
範囲外の位置を指定してもエラーにならない。
開始位置が範囲外の場合は空リストになり、終了位置が範囲外の場合は開始位置以降の全要素が返る。
array_3d = np.random.randint(2, size=(3, 3, 3))
for x0 in range(3):
for y0 in range(3):
for z0 in range(3):
AN = np.sum(array_3d[x0-1:x0+2, y0-1:y0+2, z0-1:z0+2] > 0)
neighbour_values = array_3d[x0-1:x0+2, y0-1:y0+2, z0-1:z0+2].flatten()
print(x0, y0, z0, AN, neighbour_values)
>>> 0 0 0 0 []
0 0 1 0 []
0 0 2 0 []
0 1 0 0 []
0 1 1 0 []
0 1 2 0 []
0 2 0 0 []
0 2 1 0 []
0 2 2 0 []
1 0 0 0 []
1 0 1 0 []
1 0 2 0 []
1 1 0 0 []
1 1 1 14 [1 0 1 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0]
1 1 2 9 [0 1 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0]
1 2 0 0 []
1 2 1 8 [0 0 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0]
1 2 2 5 [0 1 0 1 0 1 1 0 1 0 0 0]
2 0 0 0 []
2 0 1 0 []
2 0 2 0 []
2 1 0 0 []
2 1 1 10 [0 1 1 1 0 1 1 1 0 1 0 1 0 1 0 1 0 0]
2 1 2 6 [1 1 0 1 1 0 0 1 1 0 0 0]
2 2 0 0 []
2 2 1 6 [1 0 1 1 1 0 0 1 0 1 0 0]
2 2 2 3 [0 1 1 0 1 0 0 0]
np.whereを用いた条件を満たす行列要素の抽出
a = np.random.randint(10, size = (3,4,5))
b = np.where(a==5)
print(a)
print(b)
>>> [[[9 5 1 4 6]
[1 9 1 3 3]
[0 7 4 9 4]
[1 8 5 0 8]]
[[2 3 8 3 5]
[8 9 4 0 4]
[4 1 2 9 3]
[8 9 7 6 3]]
[[0 1 7 8 0]
[3 8 2 8 8]
[4 1 7 7 5]
[6 5 7 7 5]]]
(array([0, 0, 1, 2, 2, 2]), array([0, 3, 0, 2, 3, 3]), array([1, 2, 4, 4, 1, 4]))
データ型はタプルであることが下記の通りわかる.
print(type(b))
print(b[0])
>>> <class 'tuple'>
[0 0 1 2 2 2]
この場合,zip関数を用いることで条件を満たす各軸の要素を抽出可能である.
for x0, y0, z0 in zip(b[0], b[1], b[2]):
print(x0, y0, z0)
>>> 0 0 1
0 3 2
1 0 4
2 2 4
2 3 1
2 3 4
リストの中から重み(確率)付けしてランダムに抽出
random.choices()で,リストから重み(確率)付けしてランダムに要素を取得できる.取得してくる要素数を指定可能で,重み(確率)を指定できる.その重み(確率)の総和は0にさえならなければ特にエラーにはならない.
また,リストで返されるため注意が必要である.
list1 = [1, 3, 5, 7, 9]
list2 = [0.2, 0.3, 2, 3, 1]
a = random.choices(list1, weights=list2, k=1)
print(a)
print(a[0])
>>> [5]
5