我对.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),一行三列,对吗?
答案 0 :(得分:33)
yourarray.shape
或np.shape()
或np.ma.shape()
会将您的ndarray的形状作为元组返回;您可以使用yourarray.ndim
或np.ndim()
来获取数组的维度。
对于 1D 数组,形状为(n,)
,其中n
是数组中元素的数量。
对于 2D 数组,形状为(n,m)
,其中n
是行数,m
是数组中的列数。
请注意,在 1D 的情况下,形状只是(n, )
,而不是您对行和列向量的(1, n)
或(n, 1)
所说的内容分别
这是遵循以下惯例:
对于1D数组,返回仅带 1 元素的形状元组(即(n,)
)
对于2D数组,仅返回 2个元素的形状元组(即(n,m)
)
对于3D阵列,仅返回 3 元素(即(n,m,k)
)的形状元组
对于4D数组,返回仅包含 4 元素的形状元组(即(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
P.S。:所以,形状元组与我们对空间维度的理解一致,至少在数学上是这样。
答案 1 :(得分:3)
与其最受欢迎的商业竞争对手不同,numpy几乎从一开始就是关于&#34;任意维度&#34;数组,这就是核心类被称为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数组碰巧像你的第二个例子那样是2d,那么就行和列来考虑它是合适的。但numpy中的1d数组确实是1d,没有行或列。
如果你想要一个像行或列向量的东西你可以通过创建一个维度等于1的二维数组来实现这一点。
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
答案 2 :(得分:1)
.shape()根据数组中的元素数量,行数/列数给出数组的实际形状。 您得到的答案是以元组的形式。
例如: 一维阵列:
d=np.array([1,2,3,4])
print(d)
d
输出:(4,) 即数字4表示一维数组中的元素数。
2D阵列:
e=np.array([[1,2,3],[4,5,6]])
e
输出:(2,3),即行数和列数。
最终输出中的元素数取决于Array中的行数。...它会逐渐增加。
答案 3 :(得分:0)