.shape関数について簡単な質問があります。
a = np.array([1, 2, 3]) # Create a rank 1 array
print(type(a)) # Prints "<class 'numpy.ndarray'>"
print(a.shape) # Prints "(3,)"
b = np.array([[1,2,3],[4,5,6]]) # Create a rank 2 array
print(b.shape) # Prints "(2, 3)"
.shapeは正確に何をしましたか?行数、列数を数えると、a.shapeは(1,3)、1行3列であると仮定します。
yourarray.shape
またはnp.shape()
または np.ma.shape()
は、ndarrayの形状をTuple;として返します。そして、 yourarray.ndim
またはnp.ndim()
を使用して、配列の(数の)次元を取得できます。 (つまり、NumPyの配列はすべてn次元配列であるため、n
のndarray
になります(略してndarray
sと呼ばれます)
1D配列の場合、形状は(n,)
になります。ここで、n
は配列内の要素の数です。
2D配列の場合、形状は(n,m)
になります。ここで、n
は行数、m
は配列内の列数です。
1Dの場合、形状は、行ベクトルと列ベクトルに対してそれぞれ(n, )
または(1, n)
と言ったものではなく、単に(n, 1)
になることに注意してください。
これは、次の規則に従うことです。
1D配列の場合、1要素のみでshape Tupleを返します(つまり(n,)
)
2D配列の場合、2要素のみを含むshape Tupleを返します(つまり(n,m)
)
3D配列の場合、要素のみを含むshape Tupleを返します(つまり(n,m,k)
)
4D配列の場合、4要素のみのshape Tupleを返します(つまり(n,m,k,j)
)
等々。
また、以下の例を参照して、 np.shape()
または np.ma.shape()
が1D配列およびスカラーでどのように動作するかを確認してください。
# sample array
In [10]: u = np.arange(10)
# get its shape
In [11]: np.shape(u) # u.shape
Out[11]: (10,)
# get array dimension using `np.ndim`
In [12]: np.ndim(u)
Out[12]: 1
In [13]: np.shape(np.mean(u))
Out[13]: () # empty Tuple (to indicate that a scalar is a 0D array).
# check using `numpy.ndim`
In [14]: np.ndim(np.mean(u))
Out[14]: 0
PS:つまり、shape Tupleはconsistentです。数学的には少なくとも。
最も人気のある競合他社とは異なり、numpyは最初からほとんど「任意の次元」の配列に関するものであるため、コアクラスはndarray
と呼ばれています。 .ndim
プロパティを使用して、numpy配列の次元を確認できます。 .shape
プロパティは、各次元の長さを含む長さ.ndim
のタプルです。現在、numpyは最大32の次元を処理できます。
a = np.ones(32*(1,))
a
# array([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ 1.]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]])
a.shape
# (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
a.ndim
# 32
Numpy配列が2番目の例のようにたまたま2Dである場合、行と列の観点から考えるのが適切です。しかし、numpyの1d配列は本当に1dであり、行も列もありません。
行ベクトルまたは列ベクトルのようなものが必要な場合は、その次元のいずれかが1に等しい2D配列を作成することでこれを実現できます。
a = np.array([[1,2,3]]) # a 'row vector'
b = np.array([[1],[2],[3]]) # a 'column vector'
# or if you don't want to type so many brackets:
b = np.array([[1,2,3]]).T