Numpy配列の基礎操作--インデックス、組合せ、分割、コピー、遍歴、変換、シーケンス化(4)
Numpy配列ベース操作
1.配列インデックスアクセス
2.配列の組み合わせ(関数)
''''#組合せ関数#2つのテスト配列を作成#arangge 9つの要素を含む1次元#reshapeメソッドを作成します.サイズを変更した新しい配列を作成できます.元の配列のshapeは変更されません.#ここでreshape(3,3)は3つの要素を1つのグループの3次元グループ'''を生成します.
#水平の組み合わせ
#垂直結合
#深さの組み合わせdstack(配列の3番目の軸(すなわち深さ)を組み合わせて、新しいリスト配列を生成します)
#行の組合せ.行の組合せは、複数の1次元配列を新しい配列の各行として組合せます.2次元配列の場合、垂直の組合せのように機能します.
#カラムの組合せ(2次元配列の場合、水平の組合せのように機能します.)
3.配列分割
NumPyでは,配列を分割する関数としてhsplit,vsplit,dsplit,splitがある.配列を同じサイズのサブ配列に分割したり、元の配列が分割された位置を指定したりできます.
#水平分割
#垂直分割#垂直分割は、垂直軸に沿って配列を分割します.
#深さ方向の分割
#dsplit関数は深さ向けの分割を用いる
4.配列がメモリを共有しているかどうかを判断し、データがコピーされているかミラーされているかを直接判断する
5.配列コピーとミラー(view)
1.)配列オブジェクトまたはそのデータを複製することなく、複製せず、単純に値を付与する.
2.)viewの用法ビューメソッドは、新しい配列オブジェクトが同じデータを指すことを作成する.
実際には、このデータのメモリ領域をどのように見るかによって、固定されたデータ型はありません.ではndarray.viewでは、メモリ領域の異なる切断方法を提供し、データ型の変換を完了し、データに追加のcopyを加える必要がなく、メモリ領域を節約します.
3)スライス配列は、そのビューを返します.
4.)配列とそのデータを完全にコピーする深いコピー.
5)画像処理における応用
入力画像の3つのチャネルを同じ処理する必要がある場合、cv 2を用いる.splitとcv 2.mergeはリソースをかなり浪費しています.いずれのチャネルのデータも処理にとって同じなので、viewで1次元マトリクスに変換してから処理することができます.これにより、追加のメモリオーバーヘッドや時間オーバーヘッドが必要になりません.
5.配列遍歴
6.データ型変換
6.配列のシーケンス化と逆シーケンス化
シーケンス化は、オブジェクトのステータスを保持または転送可能な形式に変換するプロセスです.シーケンス化された補完セットは、ストリームをオブジェクトに変換する逆シーケンス化です.この2つのプロセスは、データの格納と転送が容易であることを保証します.
pythonはpickle,cPickleオブジェクトのシーケンス化/逆シーケンス化を提供します
ここではnumpyが提供する関数を使用します.
7.配列の最大値の最小値
参考と転載:
http://blog.csdn.net/sunny2038/article/details/8907736
1.配列インデックスアクセス
#!/usr/bin/env python
# encoding: utf-8
import numpy as np
b = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]],dtype=int)
c = b[0,1] #1
# : 2
d = b[:,1] #
# : [ 2 5 8 11]
e = b[1,:] #2
# : [4 5 6]
f = b[1,1:] #2 2
# : [5 6]
g = b[1,:2] #2 1 2
# : [4 5]
2.配列の組み合わせ(関数)
''''#組合せ関数#2つのテスト配列を作成#arangge 9つの要素を含む1次元#reshapeメソッドを作成します.サイズを変更した新しい配列を作成できます.元の配列のshapeは変更されません.#ここでreshape(3,3)は3つの要素を1つのグループの3次元グループ'''を生成します.
#
a = np.arange(9).reshape(3,3)
'''
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
'''
b = 2 * a
'''
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
'''
#水平の組み合わせ
np.hstack((a, b))
'''
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16]])
'''
# concatenate (axis=1 ,axis=0 )
con = np.concatenate((a, b), axis=1)
'''
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16]])
'''
#垂直結合
np.vstack((a, b))
'''
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
'''
# concatenate
con = np.concatenate((a, b), axis=0)
#深さの組み合わせdstack(配列の3番目の軸(すなわち深さ)を組み合わせて、新しいリスト配列を生成します)
np.dstack((a, b))
'''
array([[[ 0, 0],
[ 1, 2],
[ 2, 4]],
[[ 3, 6],
[ 4, 8],
[ 5, 10]],
[[ 6, 12],
[ 7, 14],
[ 8, 16]]])
'''
#行の組合せ.行の組合せは、複数の1次元配列を新しい配列の各行として組合せます.2次元配列の場合、垂直の組合せのように機能します.
one = np.arange(2)
'''
array([0, 1])
'''
two = one + 2
'''
array([2, 3])
'''
np.row_stack((one, two))
'''
array([[0, 1],
[2, 3]])
'''
#カラムの組合せ(2次元配列の場合、水平の組合せのように機能します.)
np.column_stack((oned, twiceoned))
'''
array([[0, 2],
[1, 3]])
'''
3.配列分割
NumPyでは,配列を分割する関数としてhsplit,vsplit,dsplit,splitがある.配列を同じサイズのサブ配列に分割したり、元の配列が分割された位置を指定したりできます.
#水平分割
a = arange(9).reshape(3,3)
'''
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
'''
np.hsplit(a, 3)
'''
[array([[0],
[3],
[6]]),
array([[1],
[4],
[7]]),
array([[2],
[5],
[8]])]
'''
# : split 1
np.split(a, 3, axis=1)
#垂直分割#垂直分割は、垂直軸に沿って配列を分割します.
np.vsplit(a, 3)
'''
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
'''
#
#solit 1
np.split(a, 3, axis=0)
#深さ方向の分割
#dsplit関数は深さ向けの分割を用いる
c = arange(27).reshape(3, 3, 3)
'''
array([[[ 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]]])
'''
np.dsplit(c, 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]]])]
'''
4.配列がメモリを共有しているかどうかを判断し、データがコピーされているかミラーされているかを直接判断する
# :
a = np.arange(50)
b = a.reshape((5, 10))
print (b.base is a)
# :
print (np.may_share_memory(a, b))
# :
print (b.flags['OWNDATA']) #False -- apparently this is a view
e = np.ravel(b[:, 2])
print (e.flags['OWNDATA']) #True -- Apparently this is a new numpy object.
5.配列コピーとミラー(view)
1.)配列オブジェクトまたはそのデータを複製することなく、複製せず、単純に値を付与する.
a = np.arange(12)
b = a #
b is a # a b
# true
b.shape = 3,4 # a
print a.shape
'''
(3, 4)
'''
2.)viewの用法ビューメソッドは、新しい配列オブジェクトが同じデータを指すことを作成する.
実際には、このデータのメモリ領域をどのように見るかによって、固定されたデータ型はありません.ではndarray.viewでは、メモリ領域の異なる切断方法を提供し、データ型の変換を完了し、データに追加のcopyを加える必要がなく、メモリ領域を節約します.
c = a.view()
c is a
# false
c.base is a #c a
#true
c.shape = 2,6 # a
print(a.shape) # (3, 4)
c[0,4] = 1234 #a
print a
'''
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]])
'''
3)スライス配列は、そのビューを返します.
s = a[ : , 1:3] # 1,2
s[:] = 10 # s[:] s 。 s=10 and s[:]=10
print a
'''
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
'''
4.)配列とそのデータを完全にコピーする深いコピー.
d = a.copy() #
d is a
#False
d.base is a #d a
#False
d[0,0] = 9999
print a
'''
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])
'''
5)画像処理における応用
入力画像の3つのチャネルを同じ処理する必要がある場合、cv 2を用いる.splitとcv 2.mergeはリソースをかなり浪費しています.いずれのチャネルのデータも処理にとって同じなので、viewで1次元マトリクスに変換してから処理することができます.これにより、追加のメモリオーバーヘッドや時間オーバーヘッドが必要になりません.
def createFlatView(array):
"""Return a 1D view of an array of any dimensionality."""
flatView = array.view()
flatView.shape = array.size
return flatView
5.配列遍歴
a = np.arange(9).reshape(3,3)
for row in a:
print row
'''
[0 1 2]
[3 4 5]
[6 7 8]
'''
# , flat , :
for element in a.flat:
print element
'''
0 1 2 3 4 5 6 7 8
'''
6.データ型変換
np.float64(42) # to float64
#42.0
np.int8(42.0) # to int8
#42
np.bool(42) # to bool
#True
np.bool(42.0) # to bool
#True
np.float(True) # to float
#1.0
#
arange(7, dtype=uint16)
array([0, 1, 2, 3, 4, 5, 6], dtype=uint16)
6.配列のシーケンス化と逆シーケンス化
シーケンス化は、オブジェクトのステータスを保持または転送可能な形式に変換するプロセスです.シーケンス化された補完セットは、ストリームをオブジェクトに変換する逆シーケンス化です.この2つのプロセスは、データの格納と転送が容易であることを保証します.
pythonはpickle,cPickleオブジェクトのシーケンス化/逆シーケンス化を提供します
ここではnumpyが提供する関数を使用します.
#
table = np.loadtxt('example.txt',dtype='names': ('ID', 'Result', 'Type'),\
'formats': ('S4', 'f4', 'i2'))
np.savetxt('somenewfile.txt')#
# ,
data = np.empty((1000, 1000))
np.save('test.npy', data)
np.savez('test.npz', data)#
newdata = np.load('test.npy')
7.配列の最大値の最小値
mat.max(0)#n axis=0 ,
mat.min(0)#
参考と転載:
http://blog.csdn.net/sunny2038/article/details/8907736