2017-07-28 9 views
6

引数がリストまたはタプルの場合、np.c_の出力は異なります。予想通り、列配列を返すnp.c_ list引数で3次の行listとtupleの引数を指定したnp.c_の動作

np.c_[[1,2]] 
np.c_[(1,2)] 
np.c_[(1,2),] 

の出力を考えてみましょう。引数が代わりにタプル(2行目)の場合、2行目が返されます。タプル(3行目)の後にカンマを追加すると、最初の呼び出しと同様に列配列が返されます。

誰かがこの動作の背後にある理論的根拠を説明できますか?

+0

コードを見てください。これとファイル内の他のクラス/関数( 'indexing_tricks'?)は便利ですが、面白いコーディングです。 – hpaulj

答えて

4

np.c_ 2の一般​​的なユースケースがあります

  • np.c_は、1次元アレイ同類の配列を受け入れることができる:

    In [98]: np.c_[[1,2],[3,4]] 
    Out[98]: 
    array([[1, 3], 
         [2, 4]]) 
    
  • 又は、np.c_する2D array-の配列を受け入れることができます好き:

    In [96]: np.c_[[[1,2],[3,4]], [[5,6],[7,8]]] 
    Out[96]: 
    array([[1, 2, 5, 6], 
         [3, 4, 7, 8]]) 
    

したがってnp.c_には、1D配列のようなものや2Dの配列のものを渡すことができます。 しかし、np.c_は、入力が単一の2D配列のようなものであるかどうか(例えば、[[1,2]、[3,4]])、または1D配列のようなもの(例えば[1 、2]、[3,4])?

開発者は設計の決定を下しました。np.c_にタプルが渡された場合、引数は別の配列のように扱われます。非タプル(リストなど)が渡された場合、そのオブジェクトは単一の配列のように見なされます。

したがって、np.c_[[1,2], [3,4]]np.c_[([1,2], [3,4])]に相当)は、([1,2], [3,4])を2つの別個の1Dアレイとして扱います。

In [99]: np.c_[[1,2], [3,4]] 
Out[99]: 
array([[1, 3], 
     [2, 4]]) 

対照的に、np.c_[[[1,2], [3,4]]]は、単一の2D配列として[[1,2], [3,4]]を治療するであろう。

In [100]: np.c_[[[1,2], [3,4]]] 
Out[100]: 
array([[1, 2], 
     [3, 4]]) 

したがって、例のためにあなたが投稿:

np.c_[[1,2]]扱いを単1Dアレイなど[1,2]、それは2次元アレイの列に[1,2]なるように:

In [101]: np.c_[[1,2]] 
Out[101]: 
array([[1], 
     [2]]) 

np.c_[(1,2)]扱い(1,2) 2として別個アレイ好き、それはそれ自身の列に各値を置くように:

つのアレイ状の配列として
In [102]: np.c_[(1,2)] 
Out[102]: array([[1, 2]]) 

np.c_[(1,2),]扱い(((1,2),)に相当)タプル(1,2),そのアレイ状の列として扱われるように:

In [103]: np.c_[(1,2),] 
Out[103]: 
array([[1], 
     [2]]) 

PS。おそらくほとんどのパッケージよりも、NumPyの履歴はtreating lists and tuples differentlyです。このリンクは、np.arrayに渡されたときにリストとタプルがどのように扱われるかを説明しています。 __getitem__への呼び出しに

2

引数の取り扱い上の最初のレベルは変換Pythonインタプリタ、から来ている[...]:

In [442]: class Foo(): 
    ...:  def __getitem__(self,args): 
    ...:   print(args) 
    ...:   
In [443]: Foo()['str'] 
str 
In [444]: Foo()[[1,2]] 
[1, 2] 
In [445]: Foo()[[1,2],] 
([1, 2],) 
In [446]: Foo()[(1,2)] 
(1, 2) 
In [447]: Foo()[(1,2),] 
((1, 2),) 

np.c_np.lib.index_tricks.AxisConcatenatorのインスタンスです。それはとてもnp.bmat互換性のある文字列を除き、それはタプルにすべての入力をオンにして、要素を反復処理__getitem__

# handle matrix builder syntax 
    if isinstance(key, str): 
     .... 
     mymat = matrixlib.bmat(...) 
     return mymat 

    if not isinstance(key, tuple): 
     key = (key,) 

    .... 
    for k, item in enumerate(key): 
     .... 

です。

[1,2]を含むバリエーションのいずれかは、単一エレメントタプル([1,2],)と同じです。 (1,2)は、連結される2つの要素です。だから([1,2],[3,4])です。

インデックス付けではリストとタプルも区別されることに注意してください(ただし、いくつかの矛盾があります)。

In [455]: x=np.arange(24).reshape(2,3,4) 
In [456]: x[0,1]    # tuple - index for each dim 
Out[456]: array([4, 5, 6, 7]) 
In [457]: x[(0,1)]    # same tuple 
Out[457]: array([4, 5, 6, 7]) 
In [458]: x[[0,1]]    # list - index for one dim 
Out[458]: 
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]]]) 
In [459]: x[([0,1],)]   # same 
    .... 
関連する問題