学生の備忘録なブログ

日々のことを忘れないためのブログです。一日一成果物も目標。技術系はQiitaにあげるように変更しました。

pythonのリストの記法,参照と配列操作

リスト

リスト

Pythonの組み込みとは違って、numpyのndarrayはスライスのネストa[:][-5][1:8:2]をカンマ区切りでa[:, -5, 1:8:2]とも書くことができ、こちらの方が高速なので普通こちらを使う

スライス記法の復習

list[start:end] マイナスをつければ、終わりから0スタートでカウントした順番を示す [-5:-2]なら終わりから5番目から3番目と思いきや、終わりから4番目から2番目

In [18]:
lt1 = [10,20,30,40,50,60]
print(lt1[-5:-2])
lt1[2:5] = [200, 300, 400]
print(lt1)
[20, 30, 40]
[10, 20, 200, 300, 400, 60]

スライス記法と参照,代入

Pythonの組み込みシーケンスとは違って、配列のスライスは新たにシーケンスを生成せず、もとのシーケンスへのビューを生成する。 これはどういうことだろう。

In [25]:
a = np.arange(10)
In [26]:
a
Out[26]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [36]:
# ビューオブジェクト
a_slice = a[3:6]
In [28]:
a_slice
Out[28]:
array([3, 4, 5])
In [29]:
a_slice[0] = 100
In [30]:
a_slice
Out[30]:
array([100,   4,   5])
In [31]:
a
Out[31]:
array([  0,   1,   2, 100,   4,   5,   6,   7,   8,   9])

ビューは元の配列を参照しているだけなので、ビューの要素に代入すると元の配列が変更される。

ビューではなくコピーが作りたいときは、copyメソッドを使ってa[:5, 3:].copy()などとする

In [33]:
b = np.arange(10)
b_slice = b[3:5].copy()
b_slice[0] = 100
In [35]:
print(b_slice)
print(b)
[100   4]
[0 1 2 3 4 5 6 7 8 9]
In [ ]:
## ファンシーインデックス
これは配列の参照を配列で指定するというようなイメージ
In [38]:
a = np.arange(12).reshape(3, 4)
In [39]:
a
Out[39]:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [41]:
a[[0,2,1],[3,2,0]]
Out[41]:
array([ 3, 10,  4])

配列[a[0][3],a[2][3],a[1][0]]が返ってきている。

イメージは


a[[n行目],[m列目]] array([n1m2 , n2m2 , n3*m3])


In [45]:
a[:, [3, 2, 1, 0, 3]]
Out[45]:
array([[ 3,  2,  1,  0,  3],
       [ 7,  6,  5,  4,  7],
       [11, 10,  9,  8, 11]])

このように列で操作することもできる。これは便利。

同じことを複数の行、例えば2行目1行目について行いたい場合は、ネストする。

In [49]:
c = np.arange(12).reshape(3, 4)
print(c)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
In [48]:
c[[1, 0]] [:, [3, 2, 1]]
Out[48]:
array([[7, 6, 5],
       [3, 2, 1]])
In [5]:
# スライス記号が入ってわけわからないコード
import numpy as np
In [62]:
lt = [[10,11,12,13,14,15,16,17,18,19,],[20,21,22],[30,31,32,33,34,35]]
seq_len = 3
features = np.zeros((len(lt),seq_len), dtype=int) #0埋め
In [63]:
for i , row in enumerate(lt):
    features[i, -len(row):] = np.array(row)[:seq_len]
    
# numpy.arrayは、組み込みのlistとは違い、スライスを使った記法がある
# a[][] と a[,,] は等価
# features[i][ltの途中row分から最後まで]
In [64]:
features
Out[64]:
array([[10, 11, 12],
       [20, 21, 22],
       [30, 31, 32]])
In [65]:
np.array(row)#元データ全体
Out[65]:
array([30, 31, 32, 33, 34, 35])
In [66]:
np.array(row)[:seq_len]#元データから制限文字数までを取り出す。
Out[66]:
array([30, 31, 32])
</div>