当你创建一个零维数组,例如np.array(3)
时,你得到的是一个在99.99%的情况下表现为数组的对象。你可以检查它的基本属性:
>>> x = np.array(3)
>>> x
array(3)
>>> x.ndim
0
>>> x.shape
()
>>> x[None]
array([3])
>>> type(x)
numpy.ndarray
>>> x.dtype
dtype('int32')
到目前为止还不错。这背后的逻辑很简单:只需将任何类似数组的对象包装在 np.array
的函数调用中,就可以以相同的方式处理它,无论它是数字、列表还是数组。
需要记住的一件事是,当您索引一个数组时,索引元组必须具有 ndim
或更少的元素。所以你不能这样做:
>>> x[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
相反,你必须使用一个零大小的元组(因为 x[]
是无效的语法):
>>> x[()]
3
您也可以将数组用作标量:
>>> y = x + 3
>>> y
6
>>> type(y)
numpy.int32
将两个标量相加会生成一个dtype
的标量实例,而不是另一个数组。话虽如此,在99.99%的情况下,您可以像使用x
一样使用本示例中的y
,因为dtypes
继承自ndarray
。由于np.add
将其包装在array
中,所以Python中的int
3
并不重要。y = x + x
将产生相同的结果。
这些示例中x
和y
之间的一个区别是,x
在官方上被认为不是标量:
>>> np.isscalar(x)
False
>>> np.isscalar(y)
True
索引问题可能会使您计划索引任何类似于数组的对象受阻。您可以通过在构造函数中提供ndmin=1
参数或使用reshape
轻松解决它:
>>> x1 = np.array(3, ndmin=1)
>>> x1
array([3])
>>> x2 = np.array(3).reshape(-1)
>>> x2
array([3])
我通常建议使用前一种方法,因为它不需要对输入的维度有先前的了解。
进一步阅读:
ndmin=1
。 - Mad Physicisttype(np.array(11))
是numpy.ndarray
。我的问题不在于我不理解标量或数组的含义,而是numpy将标量归类为数组类型。 - fabianegli()
。这并没有什么不合逻辑的地方。它也非常有用,例如,如果您正在编写一个希望能够处理数组和标量的函数。 - Paul Panzer