numpy.array(value)
,int
或float
,则 complex
的计算结果为true。结果似乎是一个无形的数组(numpy.array(value).shape
返回()
)。
像这样重塑上面的内容,使numpy.array(value).reshape(1)
正常工作,而numpy.array(value).reshape(1).squeeze()
则将其反转并再次导致无形数组。
此行为背后的原理是什么?该行为存在哪些用例?
答案 0 :(得分:2)
在创建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
的标量实例,而不是另一个数组。话虽如此,由于dtypes继承自y
,因此您可以以与x
完全相同的方式使用ndarray
(99.99%的时间)。 3
是Python int
并不重要,因为np.add
会将其包装在array
中。 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])
我通常建议使用前一种方法,因为它不需要输入维数的先验知识。
进一步阅读: