创建一个numpy.array,其元素由子类化的numpy.ndarray组成

时间:2015-01-09 12:10:03

标签: python arrays numpy

我正在尝试创建一个numpy数组的子类numpy数组。不幸的是,当我创建新的子类数组时,numpy会自动 upcasts 将我的数组元素转换为numpy.ndarray

下面的代码显示了我要做的事情。 dummy_class继承自numpy.ndarray并包含一些额外的功能(这对于手头的问题并不重要)。我使用dummy_class构造函数创建了两个新数组,并希望将每个子类数组放在一个新的numpy_ndarray中。当有问题的数组被初始化时,子类阵列的类型从dummy_classnumpy.ndarray 自动向上转换。一些重现问题的代码可以在下面找到

import numpy

class dummy_class(numpy.ndarray):
    def __new__(cls, data, some_attribute):
        obj = numpy.asarray(data).view(cls)
        obj.attribute = some_attribute
        return obj

array_1 = dummy_class([1,2,3,4], "first dummy")
print type(array_1)
# <class '__main__.dummy_class'>

array_2 = dummy_class([1,2,3,4], "second dummy")
print type(array_2)
# <class '__main__.dummy_class'>

the_problem = numpy.array([array_1, array_2])
print type(the_problem)
# <type 'numpy.ndarray'>
print type(the_problem[0])
# <type 'numpy.ndarray'>
print type(the_problem[1])
# <type 'numpy.ndarray'>

2 个答案:

答案 0 :(得分:3)

这是使用任意Python对象填充NumPy数组的方法:

the_problem = np.empty(2, dtype='O')
the_problem[:] = [array_1, array_2]

我同意iluengo的观点,即制作NumPy数组阵列并没有利用NumPy的优势,因为这样做需要外部NumPy数组为dtype object。对象数组需要与常规Python列表大约相同的内存量,需要比等效Python列表更多的时间来构建,计算速度不比等效的Python列表快。也许他们唯一的优势是他们提供了使用NumPy数组索引语法的能力。

答案 1 :(得分:0)

请参阅numpy文档的官方示例here

我认为上面缺少的主要成分是__array_finalize__()的实现。

链接中提供的示例InfoArray()正确地按预期工作,没有必须将新创建的数组的dtype指定为参数:

shape1 = (2,3)
array_1 = InfoArray(shape1)
print type(array_1)
#<class '__main__.InfoArray'>

shape2 = (1,2)
array_2 = dummy_class(shape2)
the_problem = numpy.array([array_1, array_2])
print type(the_problem)
#<type 'numpy.ndarray'>

print type(the_problem[0])
#<class '__main__.InfoArray'>

此外,如果结果聚合是不属于the_problem的{​​{1}}数组,那么将numpy数组子类化并将其中的许多聚合成如上所述的numpy更大的数组是很有用的。输入object

例如,假设array_1array_2具有相同的形状:

shape = (2,3)
array_1 = InfoArray(shape)
array_2 = InfoArray(shape)
the_problem = numpy.array([array_1, array_2])

现在dtype的{​​{1}}不是对象,您可以有效地计算min为the_problem。如果使用子类the_problem.min()数组的列表,则无法执行此操作。