2

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 列?

4

3 回答 3

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 个整数来指定其形状。

实际上,将 1-D 和 2-D 数组之间的计算结合起来对 来说不是问题,而且由于在 Python 3.5 中引入了矩阵运算,因此在numpy语法上也很干净。@因此,很少需要求助于来np.matrix满足查看预期行数和列数的冲动。

在需要二维的极少数情况下,您仍然可以使用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)
于 2018-02-11T01:01:58.820 回答
1

不,numpy.ndarray形状为 (1, 3) 的 a 看起来像:

np.array([[1,2,3]])

想想形状如何对应于索引:

arr[0, ...]  #First row

我还有另外三个选择,即:

arr[0,0]
arr[0,1]
arr[0,2]

尝试使用一维数组

于 2018-02-11T00:56:28.443 回答
0

我想你的意思是ndarray.shape。在这种情况下,没有必要混淆。引用以下文档ndarray.shape

数组维度的元组。

ndarray.shape只返回一个形状元组。

In [21]: a.shape
Out[21]: (3,)

这仅仅意味着这a是一个具有 3 个条目的一维数组。

如果形状元组返回它,(1,3)那么a它将成为一个二维数组。为此,您需要使用:

In [23]: a = a[np.newaxis, :]

In [24]: a.shape
Out[24]: (1, 3)

由于数组b是二维的,所以形状元组有两个条目。

In [22]: b.shape
Out[22]: (3, 4)
于 2018-02-11T01:01:24.123 回答