Numpy: Enh:对象数组创建函数

创建于 2015-06-02  ·  4评论  ·  资料来源: numpy/numpy

如问题 #5303 中所述,目前无法创建包含等长序列的 object dtype 数组,因为该序列会作为数组元素自动读入。 有一个建议只对列表执行此操作,但这将是一个重大的向后兼容性中断,并且需要很长的弃用期。

另一种方法是使用明确的函数来创建具有对象 dtype 的数组。 也许这可以称为“objectarray”。 此函数的默认设置是接收一个序列,并将序列的每个元素视为一维对象数组中的一个元素。

然而,该函数可以有一个可选的“ndim”或“depth”参数,可用于指定序列的多少级应被视为数组的一部分。 这将默认为 0(仅考虑最外层)。 如果尺寸不匹配,这将引发异常。

请注意,这种方法与替代方法并不相互排斥,但具有不会破坏向后兼容性的优点。

例如:

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))])
>>> arr
array([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], dtype=object)
>>> arr.shape
(2,)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=1)
>>> arr
array([[(1, 2, 3), (4, 5, 6)],
       [(7, 8, 9), (10, 11, 12)]], dtype=object)
>>> arr.shape
(2, 2)

>>> arr = objectarray([((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12))], depth=2)
>>> arr
array([[[1, 2, 3],
        [4, 5, 6]],

       [[7, 8, 9],
        [10, 11, 12]]], dtype=object)
>>> arr.shape
(2, 2, 3)

最有用的评论

希望我没有遗漏任何东西,但在我看来, ndmax参数不仅可以解决报告的问题(“_create arrays of object dtype contains equal-length sequences_”),而且还可以带来性能提升例如,输入中的最后一个对象不是列表(或者是具有不同长度的列表)的情况。 另请参阅此问题

所有4条评论

我认为将大小相等的列表放入对象数组的最简单方法是分两个步骤:

>>> a = empty((2,), dtype=np.object)
>>> a[:] = [[1,2,3],[4,5,6]]

>>> b = empty((2,3), dtype=np.object)
>>> b[:] = [[1,2,3],[4,5,6]]

objectarray的实现可能会像这样工作。

是的,这是目前最好的方法,但它是不必要的冗长。 于是有了这个想法。

我希望这个想法的实现能够简单地绕过array函数中使用的自动转换,并将它自己的替换为ndarray构造函数。

希望我没有遗漏任何东西,但在我看来, ndmax参数不仅可以解决报告的问题(“_create arrays of object dtype contains equal-length sequences_”),而且还可以带来性能提升例如,输入中的最后一个对象不是列表(或者是具有不同长度的列表)的情况。 另请参阅此问题

实施ndmax的任何进展或计划? 我现在在做什么:

np.array([*data, None])[:-1]

# This would look a lot cleaner:
np.array(data, ndmax=1)
此页面是否有帮助?
0 / 5 - 0 等级