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]
答案 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]