Pythonにおける配列(numpy.array)の基本動作
7086 ワード
1.なぜnumpyを使うのか
Pythonにはリストコンテナが用意されており、配列として使用できます.しかし、リスト内の要素は任意のオブジェクトであってもよいので、リストにはオブジェクトのポインタが保存され、簡単なリストを保存するために[1,2,3].3つのポインタと3つの整数オブジェクトが必要です.数値演算では,この構造は明らかに効率的ではない.Pythonはarrayモジュールも提供しているが,1次元配列のみをサポートし,多次元配列もサポートしていない(TensorFlowでは行列理解に偏っている),各種演算関数もない.したがって数値演算には適していない.NumPyの出現はこれらの不足を補った.
(——張若愚の『Python科学計算』より抜粋)
2.一般的な作成方法
(1)作成
(2)配列の共通関数
(3)タイプ変換
(4)配列出力
左から右へ、上から下へ1次元配列を行に、2次元配列をマトリクスに、3次元配列をマトリクスリストに印刷
3.基本演算
(1)要素レベル演算
(2)行列演算(2 D配列)
(3)非配列演算,呼び出し方法
4.特殊行列
5.一次元配列
a = np.arange(0,10,1)**2 print a print a[0],a[2],a[-1],a[-2]#インデックスは0から始まり、-1は最後のインデックスprint a[2:5],a[-5:-1]#は始点を含み、終点a[-1]=100を含まない.print a#賦値a[1:4]=100;print a#バッチ付与a[:6:2]=-100;print a#は最初から6番目のインデックスまで、1つの要素(ステップ=2)ごとにprint a[:-1];print a#はaを逆シーケンスで出力し、a自体はb=[np.sqrt(np.abs(i))for i in aを変更しなかった.print b#遍歴による付与
[ 0 1 4 9 16 25 36 49 64 81] 0 4 81 64 [ 4 9 16] [25 36 49 64] [ 0 1 4 9 16 25 36 49 64 100] [ 0 100 100 100 16 25 36 49 64 100] [-100 100 -100 100 -100 25 36 49 64 100] [ 100 64 49 36 25 -100 100 -100 100 -100] [-100 100 -100 100 -100 25 36 49 64 100] [10.0, 10.0, 10.0, 10.0, 10.0, 5.0, 6.0, 7.0, 8.0, 10.0]
6.多次元配列
a = np.arange(0,20).reshape((4,5))print a,a[2,3],a[:,1],a[1:4,2],a[1:3,:]print a[-1]#はa[-1,:]に相当し、すなわちインデックスが軸数より少ない場合、確実なインデックスはスライス全体にデフォルト設定される
b = np.arange(0,24).reshape((2,3,4))print b,b[1]#はb[1,:,:]およびb[1,...]print'-----------for row in a:print row#遍歴は最初の軸に基づいている
[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] 13 [ 1 6 11 16] [ 7 12 17] [[ 5 6 7 8 9] [10 11 12 13 14]] [15 16 17 18 19] [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
[[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
[[12 13 14 15] [16 17 18 19] [20 21 22 23]]
[0 1 2 3 4] [5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]
7.reshapeとresize
a = np.Array([1,2,3],[4,5,6])b=a.reshape((3,2)#配列自体の形状を変更しないprint a b.resize((3,2))#配列自体の形状を変更するprint b
[[1 2 3] [4 5 6]] [[1 2] [3 4] [5 6]]
numpyモジュールでは、resizeとreshapeをよく使用します.具体的な使用では、通常、resizeを使用して配列のサイズを変更し、reshapeを使用して配列の次元を増やすことができます.
1.resize
以前、他の人のブログを見て、resizeは値を返していないと言っていましたが、実はこれはあなたがresizeをどのように使うかによって決まります.resizeには2つの使い方があります.1つは値を返していないので、元のデータを直接修正します.もう1つは戻り値があるので、元の配列値は変更しません.
1.1元のデータを修正しない戻り値がある
1.2戻り値なしで元の配列のサイズを直接変更する
2.reshape
データを変更せずに配列に新しい形状を与える
作者:furuit出所:CSDN原文:https://blog.csdn.net/fu6543210/article/details/83240024本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!
Pythonにはリストコンテナが用意されており、配列として使用できます.しかし、リスト内の要素は任意のオブジェクトであってもよいので、リストにはオブジェクトのポインタが保存され、簡単なリストを保存するために[1,2,3].3つのポインタと3つの整数オブジェクトが必要です.数値演算では,この構造は明らかに効率的ではない.Pythonはarrayモジュールも提供しているが,1次元配列のみをサポートし,多次元配列もサポートしていない(TensorFlowでは行列理解に偏っている),各種演算関数もない.したがって数値演算には適していない.NumPyの出現はこれらの不足を補った.
(——張若愚の『Python科学計算』より抜粋)
import numpy as np
2.一般的な作成方法
(1)作成
a = np.array([2,3,4])
b = np.array([2.0,3.0,4.0])
c = np.array([[1.0,2.0],[3.0,4.0]])
d = np.array([[1,2],[3,4]],dtype=complex) #
print a, a.dtype
print b, b.dtype
print c, c.dtype
print d, d.dtype
[2 3 4] int32
[ 2. 3. 4.] float64
[[ 1. 2.]
[ 3. 4.]] float64
[[ 1.+0.j 2.+0.j]
[ 3.+0.j 4.+0.j]] complex128
(2)配列の共通関数
print np.arange(0,7,1,dtype=np.int16) # 0 , 1 ( )
print np.ones((2,3,4),dtype=np.int16) # 2 ,3 ,4 , 1,
print np.zeros((2,3,4)) # 2 ,3 ,4 , 0
print np.empty((2,3)) #
print np.arange(0,10,2) # 0, 10, 2
print np.linspace(-1,2,5) # -1, 2, 5
print np.random.randint(0,3,(2,3)) # 0, 3,2 3
[0 1 2 3 4 5 6]
[[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]]
[[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]]
[[ 1.39069238e-309 1.39069238e-309 1.39069238e-309]
[ 1.39069238e-309 1.39069238e-309 1.39069238e-309]]
[0 2 4 6 8]
[-1. -0.25 0.5 1.25 2. ]
[[1 0 1]
[0 1 0]]
(3)タイプ変換
print float(1)
print int(1.0)
print bool(2)
print float(True)
1.0
1
True
1.0
(4)配列出力
左から右へ、上から下へ1次元配列を行に、2次元配列をマトリクスに、3次元配列をマトリクスリストに印刷
print np.arange(1,6,2)
print np.arange(12).reshape(3,4) #
print np.arange(24).reshape(2,3,4)# 2 ,3 ,4
[1 3 5]
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
3.基本演算
(1)要素レベル演算
a = np.array([1,2,3,4])
b = np.arange(4)
print a, b
print a-b
print a*b
print a**2
print 2*np.sin(a)
print a>2
print np.exp(a) #
[1 2 3 4] [0 1 2 3]
[1 1 1 1]
[ 0 2 6 12]
[ 1 4 9 16]
[ 1.68294197 1.81859485 0.28224002 -1.51360499]
[False False True True]
[ 2.71828183 7.3890561 20.08553692 54.59815003]
(2)行列演算(2 D配列)
>>> A = np.arange (1,5).reshape (2,2)
>>> B = np.arange (0,4).reshape (2,2)
>>>> print(A)
[[1 2]
[3 4]]
>>> print(B)
[[0 1]
[2 3]]
>>> np.multiply(A,B)
array([[ 0, 2],
[ 6, 12]])
>>> np.multiply(np.mat(A),np.mat(B)) #mat
matrix([[ 0, 2],
[ 6, 12]])
>>> np.sum(np.multiply(np.mat(A),np.mat(B))) #sum
20
>>> np.dot(A,B) #
array([[ 4, 7],
[ 8, 15]])
>>> C = np.arange (1,4)
>>> D = np.arange (0,3)
>>> np.dot(C,D)
8
>>> np.dot(C.reshape (3,-1).T, D.reshape (3,-1)) #.T
array([[8]])
>>> np.dot(np.mat(A),np.mat(B))
matrix([[ 4, 7],
[ 8, 15]])
(3)非配列演算,呼び出し方法
a = np.random.randint(0,5,(2,3))
print a
print a.sum(),a.sum(axis=1),a.sum(0) # axis ( , 0 1)
print a.min(),a.max(axis=1),a.mean(axis=1) # axis = 0: ,axis = 1:
print a.cumsum(1) #
[[2 3 3]
[0 2 1]]
11 [8 3] [2 5 4]
0 [3 2] [ 2.66666667 1. ]
[[2 5 8]
[0 2 3]]
4.特殊行列
>>> np.eye(5) #
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
>>> A
array([[1, 2],
[3, 4]])
>>> np.linalg.inv(A) #
array([[-2. , 1. ],
[ 1.5, -0.5]])
>>> np.linalg.det(A) #
-2.0000000000000004
>>> A_inv * A_det # :A*=|A|A^(-1)
array([[ 4., -2.],
[-3., 1.]])
>>> A.T #
array([[1, 3],
[2, 4]])
5.一次元配列
a = np.arange(0,10,1)**2 print a print a[0],a[2],a[-1],a[-2]#インデックスは0から始まり、-1は最後のインデックスprint a[2:5],a[-5:-1]#は始点を含み、終点a[-1]=100を含まない.print a#賦値a[1:4]=100;print a#バッチ付与a[:6:2]=-100;print a#は最初から6番目のインデックスまで、1つの要素(ステップ=2)ごとにprint a[:-1];print a#はaを逆シーケンスで出力し、a自体はb=[np.sqrt(np.abs(i))for i in aを変更しなかった.print b#遍歴による付与
[ 0 1 4 9 16 25 36 49 64 81] 0 4 81 64 [ 4 9 16] [25 36 49 64] [ 0 1 4 9 16 25 36 49 64 100] [ 0 100 100 100 16 25 36 49 64 100] [-100 100 -100 100 -100 25 36 49 64 100] [ 100 64 49 36 25 -100 100 -100 100 -100] [-100 100 -100 100 -100 25 36 49 64 100] [10.0, 10.0, 10.0, 10.0, 10.0, 5.0, 6.0, 7.0, 8.0, 10.0]
6.多次元配列
a = np.arange(0,20).reshape((4,5))print a,a[2,3],a[:,1],a[1:4,2],a[1:3,:]print a[-1]#はa[-1,:]に相当し、すなわちインデックスが軸数より少ない場合、確実なインデックスはスライス全体にデフォルト設定される
b = np.arange(0,24).reshape((2,3,4))print b,b[1]#はb[1,:,:]およびb[1,...]print'-----------for row in a:print row#遍歴は最初の軸に基づいている
[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]] 13 [ 1 6 11 16] [ 7 12 17] [[ 5 6 7 8 9] [10 11 12 13 14]] [15 16 17 18 19] [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]]
[[12 13 14 15] [16 17 18 19] [20 21 22 23]]]
[[12 13 14 15] [16 17 18 19] [20 21 22 23]]
[0 1 2 3 4] [5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19]
7.reshapeとresize
a = np.Array([1,2,3],[4,5,6])b=a.reshape((3,2)#配列自体の形状を変更しないprint a b.resize((3,2))#配列自体の形状を変更するprint b
[[1 2 3] [4 5 6]] [[1 2] [3 4] [5 6]]
numpyモジュールでは、resizeとreshapeをよく使用します.具体的な使用では、通常、resizeを使用して配列のサイズを変更し、reshapeを使用して配列の次元を増やすことができます.
1.resize
以前、他の人のブログを見て、resizeは値を返していないと言っていましたが、実はこれはあなたがresizeをどのように使うかによって決まります.resizeには2つの使い方があります.1つは値を返していないので、元のデータを直接修正します.もう1つは戻り値があるので、元の配列値は変更しません.
1.1元のデータを修正しない戻り値がある
import numpy as np
X=np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
X_new=np.resize(X,(3,3)) # do not change the original X
print("X:
",X) #original X
print("X_new:
",X_new) # new X
>>
X:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
X_new:
[[1 2 3]
[4 5 6]
[7 8 9]]
1.2戻り値なしで元の配列のサイズを直接変更する
import numpy as np
X=np.array([[1,2,3,4],
[5,6,7,8],
[9,10,11,12]])
X_2=X.resize((3,3)) #change the original X ,and do not return a value
print("X:
",X) # change the original X
print("X_2:
",X_2) # return None
X:
[[1 2 3]
[4 5 6]
[7 8 9]]
X_2:
None
2.reshape
データを変更せずに配列に新しい形状を与える
import numpy as np
X=np.array([1,2,3,4,5,6,7,8])
X_2=X.reshape((2,4)) #retuen a 2*4 2-dim array
X_3=X.reshape((2,2,2)) # retuen a 2*2*2 3-dim array
print("X:
",X)
print("X_2:
",X_2)
print("X_3:
",X_3)
>>
X:
[1 2 3 4 5 6 7 8]
X_2:
[[1 2 3 4]
[5 6 7 8]]
X_3:
[[[1 2]
[3 4]]
[[5 6]
[7 8]]]
作者:furuit出所:CSDN原文:https://blog.csdn.net/fu6543210/article/details/83240024本文は博主のオリジナルの文章で、転載して博文のリンクを添付してください!