Python のリストや配列に要素を追加したり間引いたり逆順にしたり

Python の list と numpy.ndarray にかかわる備忘録。扇形の内部を塗りつぶす時に使ってみようとして少しはまったので。ついでにグラフを描くときの点の間引き方などもついでに備忘録として。

リストに要素を追加する

+ でリストの結合

リストに要素を追加するには + が使える。

In [1]:
a = list(range(1,6))
print(a)
[1, 2, 3, 4, 5]

リスト a の最初に 0 を追加したリストを表示する例。

In [2]:
[0] + a
Out[2]:
[0, 1, 2, 3, 4, 5]

リスト a の最後に 67 を追加したリストを表示する例。

リスト a[6, 7] を結合すればいいので…

In [3]:
a + [6, 7]
Out[3]:
[1, 2, 3, 4, 5, 6, 7]

以上のようにしても a そのものは変わらない。

In [4]:
a
Out[4]:
[1, 2, 3, 4, 5]

+= で最後にリストを追加

+= でリスト a の最後に要素あるいは(複数の要素としての)リストを追加する例:

In [5]:
a = list(range(1,6))
print(a)
a += [6]
print(a)

a = list(range(1,6))
print(a)
a += [6, 7]
print(a)
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6, 7]

.append() で最後に要素を追加

a.append() でリスト a の最後に要素を追加する例:

In [6]:
a = list(range(1,6))
print(a)
a.append(6)
print(a)
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]

.extend() で最後にリストを連結

.append() では(1個の)要素のみを追加できます。(複数個の要素としての)リストを連結するには .extend() を使います。

In [7]:
a = list(range(1,6))
print(a)
a.extend([6, 7])
print(a)
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6, 7]

.insert() で指定位置に要素を挿入

In [8]:
a = list(range(1,6))
print(a)

a.insert(2, 2.5)
print(a)
[1, 2, 3, 4, 5]
[1, 2, 2.5, 3, 4, 5]
In [9]:
a = list(range(1,6))
print(a)

a.insert(0, 0)
print(a)
[1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5]

リストの定数倍は各要素の定数倍ではない

リストの各要素を2倍するつもりで,以下のように書くと,全然違う意味になる。

In [10]:
a*2
Out[10]:
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]

a*2 = a + a のこと。

In [11]:
a + a
Out[11]:
[0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5]

リスト a の全ての要素を2倍するには…

In [12]:
a = list(range(1,6))
print(a)
# Python 的?な方法で各要素を2倍する
a2 = [2*n for n in a]
print(a2)
[1, 2, 3, 4, 5]
[2, 4, 6, 8, 10]

NumPy の import

In [13]:
import numpy as np

配列に要素を追加する np.append()

NumPy の配列に要素やリストを追加するには np.append() を使う。

In [14]:
b = np.arange(1, 6)
print(b)
[1 2 3 4 5]

配列 b の先頭に 0 を追加する例:

In [15]:
print(np.append(0, b))
[0 1 2 3 4 5]

配列 b の最後に 67 を追加する例:

In [16]:
print(np.append(b, [6, 7]))
[1 2 3 4 5 6 7]

配列への足し算は要素の追加ではない

NumPy の配列に要素を追加するつもりで,間違って + を使うと,全然違う意味になる。(各要素に数値を足してしまう。)

In [17]:
print(b + 6)
[ 7  8  9 10 11]

配列・リスト間の変換と「足し算」「掛け算」

.tolist()

どうしても配列 b に対して + を使って要素を追加したいのなら,いっそのこと .tolist() で配列からリストに変換してしまう手もある。

In [18]:
b = np.arange(1, 6)
print(b)
print(b + 6)

b.tolist() + [6]
[1 2 3 4 5]
[ 7  8  9 10 11]
Out[18]:
[1, 2, 3, 4, 5, 6]

np.array()

また,リスト a の各要素の定数倍をどうしても * でやりたいなら,いっそのこと np.array() で NumPy 配列に変換してしまう手もあるかもしれない。

In [19]:
a = list(range(1,6))
print(a)
print(a*2)

A = np.array(a)
print(A*2)
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
[ 2  4  6  8 10]

要素を間引きする(飛ばす)

データをグラフにするときなど,データ点があまりに多い場合は適宜間引いてグラフにする場合があるだろう。そんなときに,リストや配列の要素を間引きする例。

たとえば要素を2つごとに(1つ飛ばして)表示するには…

In [20]:
a = list(range(1,6))
print(a)
print(a[::2])

b = np.arange(1, 6)
print(b)
print(b[::2])
[1, 2, 3, 4, 5]
[1, 3, 5]
[1 2 3 4 5]
[1 3 5]

上記のような手軽な方法を知らない場合は,以下のように基本?に戻って少し回りくどいほうほうで… (私もかつては知らなかったので,こんな回りくどい方法で間引いているページがある。)

In [21]:
[a[i] for i in range(0, len(a), 2)]
Out[21]:
[1, 3, 5]

スライス

より一般的には a[start:stop:step] のようにしてリストや配列の一部を間引いて取り出すことができる。上記の a[::2]startstop を省略し,step = 2 とした例になる。

step を省略すると,step = 1 となる。

In [22]:
# 最初の2つの要素を取り出す
print(a[:2])
print(b[:2])
[1, 2]
[1 2]
In [23]:
# 最後の2つの要素を取り出す
print(a[-2:])
print(b[-2:])
[4, 5]
[4 5]

逆順に

step の値をマイナスにすると,逆順に表示する。

In [24]:
print(a[::2])
print(a[::-2])
print(b[::-2])
[1, 3, 5]
[5, 3, 1]
[5 3 1]
In [25]:
# [::-1] とすると逆順に表示
print(a[::-1])
print(b[::-1])

# 逆順にする別解
list(reversed(a))
[5, 4, 3, 2, 1]
[5 4 3 2 1]
Out[25]:
[5, 4, 3, 2, 1]