numpy - `numpy.array(value)` 是什么意思?

标签 numpy

numpy.array(value) 如果值为 intfloatcomplex,则计算结果为 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 继承自 ndarray3 是 Python int 并不重要,因为 np.add 会将其包装在 array 中. y = x + x 将产生相同的结果。

在这些示例中,xy 之间的一个区别是 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/

相关文章:

Python:ndarray.flatten ('F' 是否有反函数)?

python - 图像类型 int16 到 uint8 的转换

numpy - XGBoost:检查失败:有效:输入数据包含 `inf` 或 `nan`

python - 当我打乱一个 DataFrame 的副本时,为什么原始 DataFrame 也打乱了?

python - 符号学插值;从 y 得到 x

Python:numpy.corrcoef 内存错误

python - 使用 numpy/ctypes 公开 C 分配的内存缓冲区的更安全方法?

python - 压缩距离矩阵如何工作? (pdist)

python - 如何使用 matplotlib 实时绘制条形图

python - 编写更快的 Python 物理模拟器