Python Numpyデータ分析でよく使われる方法
一、多次元の表現
Numpyはリストで多次元行列を表す:1次元,次元サイズ4:%=[&&&&]//&をスカラー,%は1次元サイズ4の1次元ベクトル2次元を表し,次元サイズ3:@=[%%%]/@は3次元ベクトル%からなる3*4の2次元行列を表す上記2つの追加は,@=[&&&&][&&&&&&][&&&&&&&&][&&&&&&&&][&&&&&&&&]]となる
インデックスで値を調べると、外から探して、インデックスは1で値を見つけます.
インデックス2の値が見つかりました:
インデックス1の値が見つかりました:
索引の理解:
二、配列の生成
基本データ型:boolが1バイトで格納するTrueまたはFalse intiは、プラットフォームによってそのサイズを決定する整数(一般的にint 32またはint 64)int 8 1バイトサイズ、-128~127 int 16整数、-32768~32767 int 32整数、-2^31~2^31-1 int 64整数、-2^63~2^63-1 uint 8符号なし整数、0~255 uint 16符号なし整数、0~65535 uint 32符号なし整数、0~2^32-1 uint 64符号なし整数、0~2^64-1 float 16半精度浮動小数点数:16ビット、正負1ビット、指数5ビット、精度10ビットfloat 32単精度浮動小数点数:32ビット、正負1ビット、指数8位、精度23位float 64またはfloat二重精度浮動小数点数:64位、正負番号1位、指数11位、精度52位complex 64複数、それぞれ2つの32位浮動小数点数で実部と虚部complex 128またはcomplex複数を表し、それぞれ2つの64位浮動小数点数で実部と虚部を表す
Arrayメソッド:
Arrangeメソッド:
linspaceメソッド(1-3を9部に分ける):
zeros(0)、ones(1)、eye(対角):
乱数:numpy.random.uniform関数のプロトタイプ:numpy.random.uniform(low,high,size)は均一分布[low,high]からランダムにサンプリングされ、定義ドメインは左閉右開、すなわちlowを含み、highを含まないことに注意する.
randint:プロトタイプ:numpy.random.randint(low,high=None,size=None,dtype=‘l’)は、ランダム整数を生成する.
random_integers:プロトタイプ:numpy.random.random_integers(low,high=None,size=None)は、閉区間でランダム整数を生成する.
random_sample:プロトタイプ:numpy.random.random_sample(size=None)は、[0.0,1.0)上でランダムにサンプリングされる.
random:プロトタイプ:numpy.random.random(size=None)、random_Sample同様、random_sampleの別名;
rand:プロトタイプ:numpy.random.rand(d 0,d 1,...,dn)は、d 0−d 1−...−dn形状の[0,1]に均一に分布するfloat型数を生成する.
randn:プロトタイプ:numpy.random.randn(d 0,d 1,...,dn)は、d 0−d 1−...−dn形状の標準正規分布のfloat型数を生成する.
三、配列属性
四、配列インデックス、スライス
索引:
スライス:
次元のサイズを変更するには、次の手順に従います.
五、演算
±*/演算子±*/は各要素を計算する
その他の方法:sum min max
sin floor exp
配列が長すぎる場合、Numpyはデフォルトで両端データのみを印刷し、set_を設定します.printoptions(threshold=‘nan’)強制印刷
sign
六、合併
深いコピーに属する
接合:元のpython:
numpyメソッド:
異なるshapeに対してlistとnumpyを混在させる:
七、分割
垂直分割と水平分割:
深さ分割:
八、マトリックスアルゴリズム
九、その他
numpy.where関数は三元式xif condition else yのベクトル化バージョンである
次元の転置:
NULL値があるかどうかを判断します.
列を削除:
ファイルの読み書き:
並べ替え:
ヒストグラム:
重量除去:
numpyとlist変換:
インデックスを生成してデータを乱す:
計算ポイント:
Numpyはリストで多次元行列を表す:1次元,次元サイズ4:%=[&&&&]//&をスカラー,%は1次元サイズ4の1次元ベクトル2次元を表し,次元サイズ3:@=[%%%]/@は3次元ベクトル%からなる3*4の2次元行列を表す上記2つの追加は,@=[&&&&][&&&&&&][&&&&&&&&][&&&&&&&&][&&&&&&&&]]となる
:
>>> b = numpy.arange(24).reshape(2,3,4)
>>>print b
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
>>> b[1,2,1]
21
インデックスで値を調べると、外から探して、インデックスは1で値を見つけます.
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]
インデックス2の値が見つかりました:
[20 21 22 23]
インデックス1の値が見つかりました:
21
索引の理解:
:
import numpy as np
t = np.array(
[
[
[
[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]
]
]
])
print(t[0,:,:,:])
[[[ 1 2 3]
[ 4 5 6]]
[[ 7 8 9]
[10 11 12]]
[[13 14 15]
[16 17 18]]]
print(t[:,0,:,:])
[[[ 1 2 3]
[ 4 5 6]]
[[19 20 21]
[22 23 24]]]
print(t[:,:,0,:])
[[[ 1 2 3]
[ 7 8 9]
[13 14 15]]
[[19 20 21]
[25 26 27]
[31 32 33]]]
print(t[:,:,:,0])
[[[ 1 4]
[ 7 10]
[13 16]]
[[19 22]
[25 28]
[31 34]]]
二、配列の生成
基本データ型:boolが1バイトで格納するTrueまたはFalse intiは、プラットフォームによってそのサイズを決定する整数(一般的にint 32またはint 64)int 8 1バイトサイズ、-128~127 int 16整数、-32768~32767 int 32整数、-2^31~2^31-1 int 64整数、-2^63~2^63-1 uint 8符号なし整数、0~255 uint 16符号なし整数、0~65535 uint 32符号なし整数、0~2^32-1 uint 64符号なし整数、0~2^64-1 float 16半精度浮動小数点数:16ビット、正負1ビット、指数5ビット、精度10ビットfloat 32単精度浮動小数点数:32ビット、正負1ビット、指数8位、精度23位float 64またはfloat二重精度浮動小数点数:64位、正負番号1位、指数11位、精度52位complex 64複数、それぞれ2つの32位浮動小数点数で実部と虚部complex 128またはcomplex複数を表し、それぞれ2つの64位浮動小数点数で実部と虚部を表す
Arrayメソッド:
:
>>> print numpy.array([[1,2],[3,4]], dtype=int16) //
[[1 2]
[3 4]]
>>> print numpy.array((1.0,2,3,4))
[ 1.0 2. 3. 4. ]
Arrangeメソッド:
>>> print numpy.arange(11)
[ 0 1 2 3 4 5 6 7 8 9 10]
linspaceメソッド(1-3を9部に分ける):
>>> print numpy.linspace(1,3,9)
[ 1. 1.25 1.5 1.75 2. 2.25 2.5 2.75 3. ]
zeros(0)、ones(1)、eye(対角):
>>> print numpy.zeros((3,4))
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
>>> print numpy.ones((3,4))
[[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]
[ 1. 1. 1. 1.]]
>>> print numpy.eye(3)
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
乱数:numpy.random.uniform関数のプロトタイプ:numpy.random.uniform(low,high,size)は均一分布[low,high]からランダムにサンプリングされ、定義ドメインは左閉右開、すなわちlowを含み、highを含まないことに注意する.
randint:プロトタイプ:numpy.random.randint(low,high=None,size=None,dtype=‘l’)は、ランダム整数を生成する.
random_integers:プロトタイプ:numpy.random.random_integers(low,high=None,size=None)は、閉区間でランダム整数を生成する.
random_sample:プロトタイプ:numpy.random.random_sample(size=None)は、[0.0,1.0)上でランダムにサンプリングされる.
random:プロトタイプ:numpy.random.random(size=None)、random_Sample同様、random_sampleの別名;
rand:プロトタイプ:numpy.random.rand(d 0,d 1,...,dn)は、d 0−d 1−...−dn形状の[0,1]に均一に分布するfloat型数を生成する.
randn:プロトタイプ:numpy.random.randn(d 0,d 1,...,dn)は、d 0−d 1−...−dn形状の標準正規分布のfloat型数を生成する.
三、配列属性
>>> a = numpy.ones((3,4))
>>> print a.ndim #
2
>>> print a.shape #
(3, 4)
>>> print a.size #
12
>>> print a.dtype #
float64
>>> print a.itemsize #
8
四、配列インデックス、スライス
索引:
>>> b = numpy.arange(24).reshape(2,3,4)
>>>print b
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
>>> b[1,2,1]
21
スライス:
>>> b = numpy.arange(12).reshape(4,3)
>>> print b
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
# -1 , python a 3
np.reshape(a, (3,-1))
次元のサイズを変更するには、次の手順に従います.
。
np.c_[np.array([1,2,3]), np.array([4,5,6])]
Out[96]:
array([[1, 4],
[2, 5],
[3, 6]])
np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
Out[97]: array([[1, 2, 3, 0, 0, 4, 5, 6]])
x = np.array([[[0], [1], [2]]])
print(x)
"""
x=
[[[0]
[1]
[2]]]
"""
print(x.shape) # (1, 3, 1)
x1 = np.squeeze(x)
print(x1) # [0 1 2]
print(x1.shape) # (3,)
五、演算
±*/演算子±*/は各要素を計算する
>>> print a
[[ 1. 1.]
[ 1. 1.]]
>>> print b
[[ 1. 0.]
[ 0. 1.]]
>>> print a+b
[[ 2. 1.]
[ 1. 2.]]
>>> print a-b
[[ 0. 1.]
[ 1. 0.]]
>>> print b*2
[[ 2. 0.]
[ 0. 2.]]
>>> print (a*2)*(b*2)
[[ 4. 0.]
[ 0. 4.]]
>>> print b/(a*2)
[[ 0.5 0. ]
[ 0. 0.5]]
>>> print (a*2)**4
[[ 16. 16.]
[ 16. 16.]]
その他の方法:sum min max
>>> a = numpy.ones((3,4))
>>> a.sum()
12
>>> a.sum(axis=0) #
array([ 4, 4, 4])
>>> a.min()
1
>>> a.max()
1
# axis : 。 : 0, 1, 2。
>>> print(X)
[[[5 2]
[4 2]]
[[1 3]
[2 3]]
[[1 1]
[0 1]]]
>>> X.sum(axis=0) //
array([[7, 6],
[6, 6]])
>>> X.sum(axis=1) //
array([[9, 4],
[3, 6],
[1, 2]])
>>> X.sum(axis=2) //
array([[7, 6],
[4, 5],
[2, 1]])
>>> print a
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> a.sum(axis=0) //
array([ 9, 12, 15])
>>> a.sum(axis=1) //
array([ 3, 12, 21])
sin floor exp
>>> print a
[[ 1. 1.]
[ 1. 1.]]
>>> numpy.sin(a)
array([[ 0.84147098, 0.84147098],
[ 0.84147098, 0.84147098]])
>>> numpy.floor(a)
array([[ 1., 1.],
[ 1., 1.]])
>>> numpy.exp(a)
array([[ 2.71828183, 2.71828183],
[ 2.71828183, 2.71828183]])
配列が長すぎる場合、Numpyはデフォルトで両端データのみを印刷し、set_を設定します.printoptions(threshold=‘nan’)強制印刷
sign
import numpy as np
np.sign([-5., 0, 4.5])
# 0 1, 0 -1 array([-1., 0., 1.])
六、合併
深いコピーに属する
>>> a = numpy.ones((2,2))
>>> b = numpy.eye(2)
//
>>> print np.vstack((a,b)) // row_stack()
[[ 1. 1.]
[ 1. 1.]
[ 1. 0.]
[ 0. 1.]]
//
>>> print numpy.hstack((a,b)) // column_stack()
[[ 1. 1. 1. 0.]
[ 1. 1. 0. 1.]]
//
>>> print a
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> b = a*2
>>> print b
[[ 0 2 4]
[ 6 8 10]
[12 14 16]]
>>> print numpy.dstack((a,b)) //a b
[[[ 0 0]
[ 1 2]
[ 2 4]]
[[ 3 6]
[ 4 8]
[ 5 10]]
[[ 6 12]
[ 7 14]
[ 8 16]]]
>>> a = numpy.ones((1,1))
>>> b = a # ,
>>> b is a
True
>>> c = a.copy() #
>>> c is a
False
接合:元のpython:
y1 = [[1,0],[0,0]]
y2 = [[0,0],[0,1]]
y1.append(y2) # y2 y1
# [[1, 0], [0, 0], [[0, 0], [0, 1]]]
y1 = [[1,0],[0,0]]
y2 = [[0,0],[0,1]]
y1.extend(y2) # y2 y1
# [[1, 0], [0, 0], [0, 0], [0, 1]]
numpyメソッド:
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[11,21,31],[7,8,9]])
np.append(a,b) # a b
# array([ 1, 2, 3, 4, 5, 6, 11, 21, 31, 7, 8, 9])
import numpy as np
a=np.array([[1,2,3],[4,5,6]])
b=np.array([[11,21,31],[7,8,9]])
np.concatenate((a,b)) # a b axis=0
array([[ 1, 2, 3],
[ 4, 5, 6],
[11, 21, 31],
[ 7, 8, 9]])
y1 = np.array([ [[1,0],[1,0]] , [[0,0],[0,0]] ])
y2 = np.array([ [[0,0],[0,0]] , [[0,1],[0,1]] ])
np.concatenate((y1,y2),axis=1) # =1
array([[[1, 0],
[1, 0],
[0, 0],
[0, 0]],
[[0, 0],
[0, 0],
[0, 1],
[0, 1]]])
異なるshapeに対してlistとnumpyを混在させる:
y1 = [ np.array([[1,0,0],[1,0,0]]) , np.array([[0,0],[0,0]]) ]
y2 = [ np.array([[0,0,0],[0,0,0]]) , np.array([[0,1],[0,1]]) ]
np.concatenate((y1[0],y2[0]))
array([[1, 0, 0],
[1, 0, 0],
[0, 0, 0],
[0, 0, 0]])
七、分割
垂直分割と水平分割:
>>> print a
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> numpy.hsplit(a,3)
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
>>> print numpy.hsplit(a,3)
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
>>> print a
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> numpy.hsplit(a,3)
[array([[0],
[3],
[6]]), array([[1],
[4],
[7]]), array([[2],
[5],
[8]])]
>>> numpy.vsplit(a,3)
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
深さ分割:
>>> a = numpy.arange(27).reshape(3,3,3)
>>> print a
[[[ 0 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]]]
>>> numpy.dsplit(a,3)
[array([[[ 0],
[ 3],
[ 6]],
[[ 9],
[12],
[15]],
[[18],
[21],
[24]]]), array([[[ 1],
[ 4],
[ 7]],
[[10],
[13],
[16]],
[[19],
[22],
[25]]]), array([[[ 2],
[ 5],
[ 8]],
[[11],
[14],
[17]],
[[20],
[23],
[26]]])]
八、マトリックスアルゴリズム
>>> print a
[[1 0]
[2 3]]
>>> numpy.dot(a,a) # ,
array([[ 1, 0],
[ 8, 9]])
>>> print a.transpose() #
[[1 2]
[0 3]]
>>> print numpy.trace(a) #
4
九、その他
numpy.where関数は三元式xif condition else yのベクトル化バージョンである
plt.plot(xx, np.where(xx < 1, 1 - xx, 0), 'g-',label="Hinge loss")
# if xx<1 1-xx 0
次元の転置:
# 0 1 2 3 , 3 0 1 2
b = np.transpose(np.float32(a[:,:,:,np.newaxis]), (3,0,1,2))
NULL値があるかどうかを判断します.
import numpy as np
data = np.array([1,2,3,np.nan,4,np.nan])
# bool
np.isnan(data)
# array([False, False, False, True, False, True], dtype=bool)
# nan
np.isnan(data).sum()
# 2
列を削除:
:
np.delete(arr, [1,2], axis=1) # , ,
:
np.delete(arr, -1, axis=0)
ファイルの読み書き:
np.savetxt('a.csv',a,fmt='%d',delimiter=',')# ,
b = loadtxt('a.csv',dtype=int,delimiter=',',usecols=(1,3,4))
Save an array to a binary file in NumPy .npy format.
np.save(outfile, x)
np.load(outfile)
並べ替え:
np.sort(a,axis=1)
ヒストグラム:
np.histogram(num_count,bins=20)
重量除去:
label_u = np.unique(label)
numpyとlist変換:
np.array(a)
a.tolist()
インデックスを生成してデータを乱す:
np.random.seed(7)
index = np.arange(train_num)
np.random.shuffle(index)
print(index[:10])
part = int(0.90*train_num)
X_train = X[:part]
X_val = X[part:]
計算ポイント:
for i in range(8):
print(i,":",np.percentile(continues[i],95)) #95%