Numpy配列の基礎操作--インデックス、組合せ、分割、コピー、遍歴、変換、シーケンス化(4)

7490 ワード

Numpy配列ベース操作
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