Python numpy数组'大小'让我很困惑
a = np.array([1,2,3])
a.size = (3, )
------------------------
b = np.array([[2,1,3,5],
[2,2,5,1],
[3,6,99,5]])
b.size = (3,4)
'b'是有意义的,因为它每行有3行和4列但是'a'size =(3,)怎么样?不应该是(1,3),因为它的1行和3列?
不,形状(1,3)的numpy.ndarray
看起来像:
np.array([[1,2,3]])
想想形状如何与索引相对应:
arr[0, ...] #First row
我还有三个选择,即:
arr[0,0]
arr[0,1]
arr[0,2]
尝试使用1维数组
您应该抵制将numpy
数组视为具有行和列的冲动,而是将它们视为具有尺寸和形状。这是区分np.array
和np.matrix
的重要一点:
x = np.array([1, 2, 3])
print(x.ndim, x.shape) # 1 (3,)
y = np.matrix([1, 2, 3])
print(y.ndim, y.shape) # 2 (1, 3)
n-D数组只能使用n个整数来表示其形状。因此,1-D数组仅使用1个整数来指定其形状。
在实践中,组合1-D和2-D阵列之间的计算对于numpy
来说不是问题,并且因为@
矩阵操作是在Python 3.5中引入的,所以语法上是干净的。因此,很少需要求助于np.matrix
以满足预期行和列数的冲动。
在极少数需要2维的情况下,你仍然可以使用numpy.array
进行一些操作:
a = np.array([1, 2, 3])[:, None] # equivalent to np.array([[1], [2], [3]])
print(a.ndim, a.shape) # 2 (3, 1)
b = np.array([[1, 2, 3]]) # equivalent to np.array([1, 2, 3])[:, None].T
print(b.ndim, b.shape) # 2 (1, 3)
我认为你的意思是ndarray.shape
。在这种情况下,不需要混淆。引用ndarray.shape
的文档:
数组维度的元组。
ndarray.shape
只返回一个形状元组。
In [21]: a.shape
Out[21]: (3,)
这只是意味着a
是一个包含3个条目的一维数组。
如果形状元组将其返回为(1,3)
,则a
将成为2D数组。为此您需要使用:
In [23]: a = a[np.newaxis, :]
In [24]: a.shape
Out[24]: (1, 3)
由于数组b
是2D,因此形状元组有两个条目。
In [22]: b.shape
Out[22]: (3, 4)