python のリストと Numpy の ndarray はどちらもデータの配列です。用途はそれぞれ異なりますが、追加や削除のような基本的な機能はどちらにもあります。が、そうした機能も、使える関数やメソッドに微妙な違いがあるので整理してみました。
python 配列 | numpy 配列 | |
追加 |
append numpy.append |
numpy.append |
挿入 |
insert numpy.insert |
numpy.insert |
連結 |
extend numpy.append + 演算子 |
numpy.append |
削除 |
del pop remove numpy.delete |
numpy.delete |
配列の 繰返し |
* 演算子 | repeat |
ソート |
sort sorted |
sort sorted |
赤字 はメソッド
メソッドで配列を操作すると元の配列が変更されます(repeat は除く)。
sorted や numpy.append のような関数で操作を行うと元の配列は変更されず、新たに配列のオブジェクトが生成されます。
メソッドでも関数でもない del は元の配列を変更します。
追加
要素を末尾に追加する方法です。
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
list_p = [1, 2, 3] # ======== append メソッド ======== list_p.append(4) print list_p #-------------- # [1, 2, 3, 4] #-------------- # ======= numpy append 関数 ======= print np.append(list_p, 5) #------------- # [1 2 3 4 5] #------------- |
numpy
1 2 3 4 5 6 7 8 9 10 |
import numpy as np list_n = np.array([1, 2, 3]) # ======= numpy append 関数 ======= print np.append(list_n, 4) #----------- # [1 2 3 4] #----------- |
挿入
要素を任意の場所に挿入する方法です。
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
list_p = ['a', 'b', 'c'] # ======== insert メソッド ======== # 引数:インデックス、値 list_p.insert(2, 'XXXX') print list_p #------------------------- # ['a', 'b', 'XXXX', 'c'] #------------------------- # ======= numpy insert 関数 ======= # 引数:配列、インデックス、値 print np.insert(list_p, 1, 'ZZZZ') #----------------------------- # ['a' 'ZZZZ' 'b' 'XXXX' 'c'] #----------------------------- |
numpy
numpy 配列の挿入は insert で行いますが、文字列を扱う場合、文字列の長さについて以下の注意が必要です。
配列の生成時に dtype で文字列の最大長を指定しておきます。
● python 2系 の場合は Sバイト数 または U文字数
例 dtype=’S6‘ (S は str型)
dtype=’U2‘ (U は unicode型)
● python 3系 の場合は U文字数
例 dtype=’U4‘
指定しない場合、初期化文字列のなかで最大長のものが、dtype に設定されます。insert では、この最大長の文字しか挿入できません。最大長を超える部分は切り捨てられます。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np list_n = np.array(['a', 'b', 'c'], dtype='S4') # ======= numpy insert 関数 ======= # 引数:配列、インデックス、値 print np.insert(list_n, 1, 'ZZZZ') #----------------------- # ['a' 'ZZZZ' 'b' 'c'] #----------------------- |
numpy 配列に insert すると、なぜか長さが切りつめられてしまいます。
上の例だと、’ZZZZ’ を挿入するつもりが ‘Z’ になってしまう ???
連結
配列と配列を連結する方法です。
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
list_p = [1, 2, 3] # ======== extend メソッド ======== list_p.extend([4, 5]) print list_p #----------------- # [1, 2, 3, 4, 5] #----------------- # ======= numpy append 関数 ======= print np.append(list_p, [6, 7]) #----------------- # [1 2 3 4 5 6 7] #----------------- # =========== + 演算子 ============ print list_p + [6, 7] #----------------------- # [1, 2, 3, 4, 5, 6, 7] #----------------------- |
numpy
1 2 3 4 5 6 7 8 9 |
list_n = np.array([1, 2, 3]) # ====== numpy append 関数 ======= print np.append(list_n, [4, 5]) #------------- # [1 2 3 4 5] #------------- |
削除
要素を削除する方法です。
python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
list_p = ['a', 'b', 'c', 'd', 'e'] # ============ del ============== del list_p[0] print list_p #---------------------- # ['b', 'c', 'd', 'e'] #---------------------- # ========= pop メソッド ========= # 引数:インデックス list_p.pop(0) print list_p #----------------- # ['c', 'd', 'e'] #----------------- # ======= remove メソッド ======== # 引数:値 list_p.remove('e') print list_p #------------ # ['c', 'd'] #------------ # ====== numpy delete 関数 ======= # 引数:インデックス print np.delete(list_p, 0) #------- # ['d'] #------- |
numpy
1 2 3 4 5 6 7 8 9 10 |
list_n = np.array(['a', 'b', 'c']) # ====== numpy delete 関数 ======= # 引数:インデックス print np.delete(list_n, 0) #----------- # ['b' 'c'] #----------- |
繰り返し
配列を繰り返します。
python
1 2 3 4 5 6 7 8 9 |
list_p = [1, 2, 3] # =========== * 演算子 ============ print list_p * 3 #----------------------------- # [1, 2, 3, 1, 2, 3, 1, 2, 3] #----------------------------- |
numpy
1 2 3 4 5 6 7 8 9 10 |
list_n = np.array([1, 2, 3]) # ======== repeat メソッド ======== # 引数:繰り返し回数 print list_n.repeat(3) #----------------------------- # [1 1 1 2 2 2 3 3 3] #----------------------------- |
ソート
ソートです。
python
reverse=True で降順。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
list_p = [10, 20, 30, 1, 2, 3] # ========== sorted 関数 ========== print sorted(list_p) #----------------------- # [1, 2, 3, 10, 20, 30] #----------------------- print sorted(list_p, reverse=True) #----------------------- # [30, 20, 10, 3, 2, 1] #----------------------- # ========= sort メソッド ========== list_p.sort() print list_p #----------------------- # [1, 2, 3, 10, 20, 30] #----------------------- list_p.sort(reverse=True) print list_p #----------------------- # [30, 20, 10, 3, 2, 1] #----------------------- |
numpy
reverse=True で降順。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
list_n = np.array([10, 20, 30, 1, 2, 3]) # ========== sorted 関数 ========== print sorted(list_n) #----------------------- # [1, 2, 3, 10, 20, 30] #----------------------- print sorted(list_n, reverse=True) #----------------------- # [30, 20, 10, 3, 2, 1] #----------------------- # ========= sort メソッド ========== list_n.sort() print list_n #--------------------- # [ 1 2 3 10 20 30] #--------------------- |
numpy の sort メソッドは reverse 指定ができません。
通りすがり says:
通りすがりのものです.
>numpy 配列に insert すると、なぜか長さが切りつめられてしまいます。
>上の例だと、’ZZZZ’ を挿入するつもりが ‘Z’ になってしまう ???
とありますが,これは,list_nを作る際に,文字列の幅が1になっているからだと思います.
list_n = np.array(['a','b','c'], dtype='|S4')
np.insert(list_n, 1, 'ZZZZ')
とすれば,うまくいくと思います.
管理人 says:
通りすがりさん、どうも有難うございます。
こんな事情があるとは知りませんでした。勉強になります。
個人的には numpy、エラーにしてくれればいいのにと思ってしまいました(笑)