2012-09-30 16 views
15

なぜnumpy.shapeは一貫性のない応答を返します - なぜですか?

import numpy as np 

c = np.array([1,2]) 
print(c.shape) 
d = np.array([[1],[2]]).transpose() 
print(d.shape) 

プログラムは、その出力として

(2,) 
(1,2) 

を与えるのでしょうか?すべきではない

(1,2) 
(1,2) 

代わりに、私はpython 2.7.3とpython 3.2.3の両方でこれを手に入れました。

+4

他の人は、他の方法で聞くかもしれないので、私はあなたが後でそれを期待する理由を伝えるべきだと思います。 – hakre

+1

あなたはmatlabを考えているかもしれませんが、 'array'と' matrix'の違いを調べるにはnumpyで配列が望ましいです。 – seberg

+1

@hakre(水平)リストと1 xn行列の間に実際の違いはありませんので、プレーン配列の形状が1 xnであると予想しました。また、d = [1 、[2]ではなく、[[1,2]]ではなく、これは何が起こっているかを見れば、それ自体の論理です。 – user1710403

答えて

1

len(c.shape)は配列の "深さ"です。 cについて

、アレイは単にリスト(ベクトル)であり、深さはd 1.
であり、配列はリストのリストであり、深さが2

。注:

c.transpose() 
# array([1, 2]) 

dではないため、この動作には一貫性がありません。

dt = d.transpose() 
# array([[1], 
#  [2]]) 
dt.shape # (2,1) 
14

あなたがndarray.shape属性を呼び出すと、あなたは配列の次元と同じ数の要素を持つタプルを取得します。 c=np.array([1,2]):長さは、すなわち、行の数は、あなたが配列で始まる最初の次元(shape[0]

  • です。これはプレーンな1D配列なので、その形状は1要素タプルになり、shape[0]は要素の数ですので、c.shape = (2,)
  • c=np.array([[1,2]])を考えてください。これは1行の2D配列です。最初の唯一の行は[1,2]で、2つの列があります。したがって、c.shape=(1,2)およびlen(c)=1
  • c=np.array([[1,],[2,]])を検討してください。 2行1列の別の2D配列:c.shape=(2,1)およびlen(c)=2
  • d=np.array([[1,],[2,]]).transpose()を考えてください:この配列はnp.array([[1,2]])と同じです。したがって、その形状は(1,2)です。

別の有用な属性は.sizeです:それは、すべての次元間の要素の数だ、とあなたは、配列cc.size = np.product(c.shape)を持っています。

documentationの形の詳細については、こちらをご覧ください。

+1

私は本当に便利なコメントはありませんが、何かの理由で私にこのようなバグがあります。 –

0

transposeは、配列の次元数を変更しません。 c.ndim == 1の場合、c.transpose() == c。試してみてください:

c = np.array([1,2]) 
print c.shape 
print c.T.shape 
c = np.atleast_2d(c) 
print c.shape 
print c.T.shape 
0

クイックフィックス:.ndimプロパティを確認する - その2あればあなたが期待するよう、そして.shapeプロパティが動作します。

理由:.ndimプロパティが2の場合、numpyは規約に合致するシェイプ値を報告します。 .ndimプロパティが1の場合、numpyはちょうど別の方法でシェイプを報告します。

その他の話題:リストのリストをnp.arrayに渡すと、.shapeプロパティは行列の次元(行、列)の標準概念と一致します。

np.arrayにリストだけを渡すと、numpyはそれが手の上に行列を持つとは考えず、図形を別の方法で報告します。

質問は:numpyは行列を持っていると思いますか、それとも手に何かがあると思いますか?

関連する問題