【问题标题】:What is the meaning of `numpy.array(value)`?`numpy.array(value)` 的含义是什么?
【发布时间】:2019-07-31 11:40:17
【问题描述】:

numpy.array(value) 计算结果为真,如果值为 intfloatcomplex。结果似乎是一个无形的数组(numpy.array(value).shape 返回())。

numpy.array(value).reshape(1) 那样重塑上面的形状可以正常工作,numpy.array(value).reshape(1).squeeze() 会反转它并再次导致无形数组。

这种行为背后的原因是什么?这种行为存在哪些用例?

【问题讨论】:

  • 你从一个标量中得到一个标量。这有什么合理的?
  • 另外,squeeze 的调用缺少括号
  • 如果你不想得到一个标量,你可以通过ndmin=1
  • 按照我的理解,标量不是数组。但是type(np.array(11))numpy.ndarray。我的问题不是我不明白什么是标量或数组是什么,而是 numpy 给了一个标量类型数组。
  • 它是一个 0D 数组,不是无形的,形状是零长度元组()。没有什么不合逻辑的。例如,如果您正在编写一个希望能够处理数组和标量的函数,它也非常有用。

标签: numpy


【解决方案1】:

当您创建像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 继承自 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])

我一般推荐前一种方法,因为它不需要输入维度的先验知识。

进一步阅读:

【讨论】:

  • x[()] - 您始终可以使用 ndim 元组进行索引。
  • @hpaulj。谢谢你的提示。我更新了语言。
  • 感谢您的回答和进一步阅读的链接。这是一个教育晚会。
  • 我偶然发现了另一种使用item函数从numpy数组中获取标量值的方法:x.item()。在研究如何使用numpy.savez()时,灵感来自here
猜你喜欢
  • 2018-09-29
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2011-09-27
  • 2011-03-30
  • 2014-10-13
  • 2017-12-09
相关资源
最近更新 更多