#CP pythonでのnumpyに関するメモ

10^7とかになるとpythonではatcoderの2s制限にひっかかってくるので、高速化のためにリストではなく、numpyの配列を使うようにしたいわけです。
ということで必要最低限のnumpyの使い方について自分用にまとめておきます。今後追加するかも。

# NumPyモジュールをインポート
import numpy as np


# リストの配列化
a1 = np.array([1,1,4,5,1,4])
print(a1) # [1 1 4 5 1 4]

# 全ての要素が0の要素数nの配列を生成
n = 5
a2 = np.zeros(n,dtype=np.int) #dtypeを指定しないとfloatになるっぽい
print(a2)

# 配列の長さを取得
l1 = len(a1)
print(l1) # 6

# 配列の要素の取得
for i in range(l1):
    print(a1[i], "", end="") # 1 1 4 5 1 4 
print() #改行

# 配列のスライス
print(a1[0:3]) # [1 1 4]

# 配列同士の四則演算(for文より早いらしい)
# リストでやると"連結"になるので注意
a3 = np.array([1,9,1,9,1,9])
print(a1+a3) # [ 2 10  5 14  2 13]
print(a1-a3) # [ 0 -8  3 -4  0 -5]
print(a1*a3) # [ 1  9  4 45  1 36]
print(a1//a3) # [1 0 4 0 1 0]

# ある数値との四則演算も可能
print(3+a1) # [4 4 7 8 4 7]
print(3-a1) # [ 2  2 -1 -2  2 -1]
print(3*a1) # [ 3  3 12 15  3 12]
print(3//a1) # [3 3 0 0 3 0]

# 配列の連結(リストにおけるextendと同様の挙動)
# 配列なのでコピーが発生→遅いらしい
a4 = np.append(a1,a3)
print(a4) # [1 1 4 5 1 4 1 9 1 9 1 9]

# 多次元配列に変換
a5 = a2.reshape(5,1)
print(a5)
# [[0]
#  [0]
#  [0]
#  [0]
#  [0]]

まとめ

リスト型はlist, 配列型はarrと表記

  • listの配列化 : np.array(list)
  • 素数nの0(整数)だけの配列の生成 : np.zeros(n, dtype=np.int)
  • 長さの取得 : len(arr)
  • indexがiの要素の取得 : arr[i]
  • 配列のスライス(リストと同じ): arr[x:y]
  • 配列同士の演算 : arr1 op arr2
  • 数値と配列の演算 : x op arr
  • 配列の連結 : np.append(arr1, arr2)
  • 多次元配列(x行y列)への変換 : arr.reshape(x,y)