这些都有效(即有.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数组(对于任意标量值)?
答案 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数组