我可以在单个表达式中从其值构造一个numpy对象零d数组吗?

时间:2016-11-21 01:13:35

标签: python numpy

这些都有效(即有.shape == ()):

np.array(1, dtype=object)
np.array("foo", dtype=object)
np.array(object(), dtype=object)

但这不是:

np.array((0, 0), dtype=object)  # .shape == (2,)

我可以通过两个作业实现这一目标:

def make_scalar(x):
    value = np.empty((), dtype=object)
    value[()] = x
    return value

make_scalar((0, 0))  # .shape == ()

是否有内置函数允许我在单个表达式中创建这个0d数组(对于任意标量值)?

1 个答案:

答案 0 :(得分:1)

当人们想要创建包含列表或元组的对象数组时,我已经多次回答了这类问题。这里所有不同的是你想用0d数组做这个。

例如:Reduce Dimensons when converting list to array

这个问题形成鲜明对比:

 np.array([[1,2],[3,4]])  # (2,2) int
 np.array([[1],[3,4]])    # (2,) object

从第一个列表中创建(2,)对象需要创建和填充方法。 np.array(...)坚持尽可能深入挖掘嵌套的迭代。可以说,它可以训练尽可能高的维度阵列。它将迭代列表和元组,但不会迭代字典或集合。

np.array采用ndmin参数,但不是ndmax参数。我相信有一些关于数组创建者的github问题会限制这个深度。

现在,创建一个空的'正确维度的对象数组,并填充它是最好的。填写时很容易出错,例如广播或使用序列进行设置。

您的make_scalar功能没有任何问题。这不是速度很重要的那种操作。所以你自己的功能和内置功能一样漂亮。

另一个想法 - scipy.io.loadmat返回许多单个元素对象数组。它这样做来表示MATLAB结构和单元格。我们可以查看它的代码,看看开发人员是否使用了任何聪明的东西。

相关的github问题:

https://github.com/numpy/numpy/issues/5933 Enh:对象数组创建函数

https://github.com/numpy/numpy/issues/6070请弃用为任意对象创建numpy数组