【问题标题】:What is the output of np.asarray(scalar)?np.asarray(scalar) 的输出是什么?
【发布时间】:2016-07-26 12:41:37
【问题描述】:

长期以来,我总是使用np.arraynp.asarraynp.asanyarray将array_like列表转换为数组。

但是当将标量转换为 numpy 数组时,我知道 np.atleast_1d(123) 会产生正确的结果,array([123])

但我对np.arraynp.asarray 的输出感到困惑

i = 123
x = np.array(i, dtype=np.int)
print x # array(123)
print x.shape  # ()
print x.size # 0

既然x.shape表示x是空的,那么array(123)是什么?这是一个 0 维数组,在其 __str__ 中仍然包含 123

size=0 的真正空数组应该是 array([])

print np.array([]).nbytes # 0
print np.array(123).nbytes # 8
print type(np.array(123)) # numpy.ndarray

显然它们是不同的,尽管它们的大小都是0

【问题讨论】:

  • x.shape 表示 x 具有空形状x 是一个标量,还有什么?
  • @JulienBernu, print x 显示array(123),而不是array([]),这是常规的空数组。
  • 投了反对票的小伙伴,请至少发表评论。这个问题不清楚,甚至你认为它太简单和愚蠢。 x 不是标量,而是 numpy.ndarray
  • 您混淆了“空”和“空形状”。 array([]).shape = (0,)x 不是空的,是一个标量,也是一个空形状的数组。
  • 这看起来是一个答案。但现在我很困惑为什么numpy 是这样设计的,将标量转换为看似无用的东西。我从未见过这种类型的 empty-shape 数组的任何应用。他们本可以提出异常或使其以np.asanyarray 的身份运行。

标签: python arrays numpy type-conversion


【解决方案1】:

我认为这个0d 案例是nd 的自然延续。 MATLAB 将 2d 设为下限。 numpy 可以使用 1d,但选择了 0d

数组由数据缓冲区、是否存储值字节、dtype(如何解释这些字节)和shape(加上strides)组成。 shape 是(显示为)一个元组。 Python 允许元组包含 0、1、2 或更多元素,那么为什么 shape 不应该具有相同的灵活性呢?

看看atleast_1d做了什么

res = []
for ary in arys:
    ary = asanyarray(ary)
    if len(ary.shape) == 0:
        result = ary.reshape(1)
    else:
        result = ary
    res.append(result)
if len(res) == 1:
    return res[0]
else:
    return res

它可以处理输入列表(标量、数组、列表等)

In [374]: np.atleast_1d(np.array(1),np.array([1]),np.array([[1]]))
Out[374]: [array([1]), array([1]), array([[1]])]

它将每个转换为数组(根据需要),然后检查暗淡(形状的长度)。如果为 0d,则将其重塑为 (1,)。此重塑不会更改数据缓冲区。 atleast_2dresult = ary.reshape(1, 1)

你也可以ndmin:

In [382]: np.array(1,ndmin=1)
Out[382]: array([1])

np.array(1) 在很多方面类似于np.int32(1)。两者都有() 形状,都有sum() 之类的方法。唯一明显的区别在于它们的打印格式。

我不知道有什么理由故意构造一个 0d 数组。如果我真的想要一个一维数组,写np.array([1]) 也很容易。但是你应该知道如果它出现了如何处理。这包括使用.item() 提取标量值,以及使用[()] 进行索引。

我最常在关于使用scipy.io.loadmat 加载 MATLAB 文件的 SO 问题中遇到它。一些 MATLAB 构造作为 0d 对象数组返回。

考虑 0d 数组的另一种方式是,它将整套数组方法添加(或保留)到标量 - 无需显式指定 dtype

我提到了与np.int32(1) 的相似之处。我在初学者的代码中见过它,但我自己并不需要它。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2017-11-22
    • 2017-09-13
    相关资源
    最近更新 更多