numpy.array(value)
如果值为 int
、float
或 complex
,则计算结果为 true。结果似乎是一个无形数组(numpy.array(value).shape
返回 ()
)。
像这样 reshape 上面的 numpy.array(value).reshape(1)
工作正常并且 numpy.array(value).reshape(1).squeeze()
将此反转并再次导致无形数组。
这种行为背后的基本原理是什么?此行为存在哪些用例?
最佳答案
当您创建像 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
的标量实例,而不是另一个数组。话虽如此,您可以使用此示例中的 y
以与 x
完全相同的方式使用,99.99% 的情况下,因为 dtypes 继承自 ndarray
。 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])
我通常推荐前一种方法,因为它不需要输入维度的先验知识。
进一步阅读:
关于numpy - `numpy.array(value)` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57289912/