这两个numpy阵列形状有什么区别?

时间:2019-03-24 00:11:08

标签: python numpy

In [136]: s = np.array([[1,0,1],[0,1,1],[0,0,1],[1,1,1]])                                                          

In [137]: s                                                                                                        
Out[137]: 
array([[1, 0, 1],
       [0, 1, 1],
       [0, 0, 1],
       [1, 1, 1]])

In [138]: x = s[0:1]                                                                                               

In [139]: x.shape                                                                                                  
Out[139]: (1, 3)

In [140]: y = s[0]                                                                                                 

In [141]: y.shape                                                                                                  
Out[141]: (3,)

In [142]: x                                                                                                        
Out[142]: array([[1, 0, 1]])

In [143]: y                                                                                                        
Out[143]: array([1, 0, 1])

在上面的代码中,x的形状为(1,3),y的形状为(3,)。

(1,3): 1 row and 3 columns
(3,): How many rows and columns in this case?

(3)代表一维数组吗?

在实践中,如果我想逐行遍历矩阵,应该走哪条路?

for i in range(len(x)):
    row = x[i]
    # OR
    row = x[i:i+1]

1 个答案:

答案 0 :(得分:1)

首先,您可以通过numpy获得array数组len(array.shape)的维数。

某些维度长度为1的数组与删除了这些维度的数组不相等,例如:

>>> a = np.array([[1], [2], [3]])
>>> b = np.array([1, 2, 3])
>>> a
array([[1],
       [2],
       [3]])
>>> b
array([1, 2, 3])
>>> a.shape
(3, 1)
>>> b.shape
(3,)
>>> a + a
array([[2],
       [4],
       [6]])
>>> a + b
array([[2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

从概念上讲,形状为(3, 1)的数组与形状为(3,)的数组之间的差异类似于[100]100的长度之间的差异。

[100]是一个{<1>}元素的list。它可以有更多,但现在它具有个可能的最小数量

另一方面,谈论100的长度甚至没有意义,因为它没有一个。

类似地,形状为(3, 1)的数组具有3行和1列,而形状为(3,)的数组完全没有列。从某种意义上说,它甚至没有行。 行,就像100没有元素一样,因为它元素。

有关与其他数组交互时形状不同的数组的行为的更多信息,请参见broadcasting rules

最后,为了完整起见,要遍历numpy数组的行,您可以执行for row in array。如果要遍历后轴,则可以使用np.moveaxis,例如:

>>> array = np.array([[1, 2], [3, 4], [5, 6]])
>>> for row in array:
...     print(row)
...
[1 2]
[3 4]
[5 6]
>>> for col in np.moveaxis(array, [0, 1], [1, 0]):
...     print(col)
...
[1 3 5]
[2 4 6]