pythonリストとNumpy配列の違い

5048 ワード

Table of Contents
 
pythonリストとNumpy配列の違い
arrayの作成
要素アクセス
arrayの1次元配列へのアクセス方法
arrayの2 D配列へのアクセス方法
リファレンスリンク
pythonリストとNumpy配列の違い
1両方とも多次元配列の処理に使用できます.
Numpyのndarrayオブジェクトは、高速で柔軟なビッグデータコンテナとして使用される多次元配列を処理するために使用されます.Pythonリストは1次元配列を格納でき,リストのネストにより多次元配列を実現できる.
2ストレージ効率と入出力性能が異なります.
Numpyは配列の操作と演算に特化して設計されており、記憶効率と入出力性能はPythonのネストリストよりはるかに優れており、配列が大きいほどNumpyの優位性が明らかになる.
3要素データ型.
通常、Numpy配列のすべての要素のタイプは同じでなければならないが、Pythonリストの要素のタイプは任意であるため、汎用性能ではNumpy配列はPythonリストに及ばないが、科学計算では多くの循環文を省くことができ、コードの使用はPythonリストよりずっと簡単である.
 
arrayの作成
Numpy配列を作成する場合、パラメータはlistでもメタグループでも構いません.例:
>>> a=np.array((1,2,3))#   tuple

>>> b=np.array([6,7,8])#   list

>>> c=np.array([[1,2,3],[4,5,6]])#     list

さらにnumpyが提供する他の方法を使用して配列を作成することもできます.たとえば、次のようにします.
>>> arr1=np.arange(1,10,1)

>>> arr2=np.linspace(1,10,10)

np.arang(a,b,c)は、a−bからbを含まない間隔cのarrayを生成することを示し、データ型はデフォルトでint 32である.しかしlinspace(a,b,c)は、a−bを平均的にc点に分け、bを含むことを示す.
今日のプログラムはステップ長の運用について:
['%x' %int(''.join(avg_list[x:x+4]),2) for x in range(0,32*32,4)]

これはハッシュアルゴリズムを感知するステップであり,次の判断のためにバイナリデータを16進数に書き換える.ここで私のバイナリデータの長さは32です.×32であり、バイナリ16進法は4ビット毎に回転できるので、ステップ長を4に設定することができる.
関数ルールから配列を作成するのも便利です.numpyのfromfunction関数はこの機能を実現します.
>>> def f(x,y):

... return 10*x+y

... b=np.fromfunction(f,(2,2))

この関数の具体的な内容は次のとおりです.
パラメータ
function:最初のパラメータは、前例で示したfのような関数です.この関数はN個のパラメータを受け入れ,各パラメータは特定の軸に沿って変化するアレイの座標を表す.例えば、上記の例では、2番目のパラメータ(2,2)では、このN番目のパラメータは、(0,0)(0,1)(1,0)(1,1)である.shape:2番目のパラメータは、配列のサイズを表すメタグループです.dtype:3番目のパラメータは、関数に渡されるデータ型を決定し、デフォルトは浮動小数点型です. 
戻り値
配列を返します. 
要素アクセス
arrayの1次元配列へのアクセス方法
1次元配列を定義し、
arr=np.array([0,1,2,3,4,5,6,7,8,9])

arr[5]
6番目の要素#にアクセスした結果:5
arr[3:5]
4~5番目の要素にアクセスした結果:array([3,4])arr[:5]
アクセス前5要素#結果:array([0,1,2,3,4])arr[:-1]
最後の要素以外の要素にアクセスした結果:array([0,1,2,3,4,5,6,7,8])arr[:]
すべての#結果にアクセス
arr[2:4]=100
3~4個の要素を100#に設定した結果::array([0,1,2,3,4,5,6,7,8,9])arr[1:-1:2]
最初の要素から最後の要素へのアクセス、ステップ2の結果:array([0,1,100,100,4,5,6,7,8,9])arr[::-1]
最初の要素から最後の要素にアクセスします.ステップ長は-1#の結果:array([1,100,5,7]) 
ここでarr[a:b:n]は、ステップ長nでaからbまでの要素をとり、nが-1の場合、右から左へアクセスすることを示す.
arrayの2 D配列へのアクセス方法
二次元配列arr=npについて.Array([1,2,3],[4,5,6])では、以下の方法でアクセスできます.
arr[1:2]
最初の行#の結果を返します:[[1,2,3]]
arr[1:2][0]
最初の行#の結果を返します:[1,2,3]
arr[1]
最初の行#の結果を返します:[1,2,3]
以上の文は2次元配列の最初の行を返しますが、「:」でアクセスすると、最終的には外に「[]」が付けられ、2番目の文のように1つのインデックスで最終的な結果を得ることができます.
ここで、最近切り取った画像の一例を思い出します.
通常、imreadのピクチャは、img=[[0,1,2],[3,4,5],[6,7,8]]のような配列オブジェクトに保存する.この画像の(0,0)から(1,1)の矩形領域を切り取りたいのですが、img[0:1,0:1]の文で完成できます.切り取った結果は[[0,1],[3,4]]である.
また、arrayのインデックスは最終的に「元のデータの浅いコピー」を生成し、元のデータとメモリを共有します.
>>> import numpy as np

>>> a=np.array([0,1,2])

>>> b=a[:2]

>>> b

array([0, 1])

>>> b[0]=100

>>> b

array([100, 1])

>>> a

array([100, 1, 2])

bの最初の要素を修正すると、aの最初の要素も修正されます.同じメモリを指しているからです.
これは,b=a[:2]などの文を実行すると,この要素を指すポインタがコピーされ,修正しようとするとポインタが指す要素値も修正されるからである. 
>>> a=[0,1,2]

>>> b=a[:2]

>>> b

[0, 1]

>>> b[0]=100

>>> b

[100, 1]

>>> a

[0, 1, 2]


これとは異なり、listオブジェクトが実行時にデータとポインタをコピーしている場合、このような状況はありません.
上記のインデックスに基づいて要素にアクセスする方法のほかに、arrayにはもっと優れた方法があります.
1ブール配列の使用
>>> a=np.array([0,1,2,3,4,5,6])

>>> b=a>3

>>> b

array([False, False, False, False, True, True, True])

>>> a[b]

array([4, 5, 6])


注目すべきは,この方法は配列にのみ適用され,listは資格がないことである.上の例に示すように、ブールインデックスは最終的にTrueとして下付きのデータを返します.
2リストインデックス
>>> a=np.array(['a','b','c','d','e'])

>>> a

array(['a', 'b', 'c', 'd', 'e'], dtype='>> b=[0,1]

>>> a[b]

array(['a', 'b'], dtype='>> 

リストインデックスは、配列およびlistオブジェクトに適しています.
以上の2つの「フラワーインデックス」は、元のデータとメモリを共有しません.
 
今日は主にarrayとlistの違いをまとめたいと思います.
python要素は、python object情報をすべて含むメモリの位置ポインタです.
List:一連のポインタブロックを指すポインタで、各ポインタはintegerなどの完全なpython objectオブジェクトを指します.各list要素は、データと情報タイプを含む完全な構造です.したがって、リストには任意のタイプのデータが埋め込まれます.
numpy.Array:最下位はC言語です.ステップstrides,dimensions,dataの3つのプロパティがあります.彼の要素タイプは固定されており、柔軟性に欠けていますが、データの保存と処理が容易です.
リファレンスリンク
[1]https://blog.csdn.net/wyl1813240346/article/details/79806207
[2]https://blog.csdn.net/liyaohhh/article/details/51055147#reply
[3]https://docs.scipy.org/doc/numpy-dev/user/quickstart.html