簡體   English   中英

創建一個numpy.ndarray,其元素由子類numpy.ndarray組成

[英]Creating a numpy.ndarray with elements consisting of subclassed numpy.ndarray's

我正在嘗試創建一個numpy數組的子類numpy數組。 不幸的是,當我創建我的子類的新陣,numpy的自動upcasts我的數組中的元素numpy.ndarray

下面的代碼顯示了我想要做的事情。 dummy_class繼承自numpy.ndarray並包含一些額外的功能(這對於手頭的問題並不重要)。 我使用dummy_class構造函數創建了兩個新數組,並希望將每個子類數組放在一個新的numpy_ndarray 當有問題的數組被初始化時,子類化數組的類型會自動dummy_class 向上 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'>

這是使用任意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數組索引語法的能力。

請參閱這里的numpy文檔的官方示例。

我認為上面缺少的主要成分是__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'>

此外,如果生成的聚合是一個非類型為objectnumpy數組,那么將numpy數組子類化並將它們中的許多聚合成一個更大的數組(如the_problem所報告的the_problem是很有用的。

例如,假設array_1array_2具有相同的形狀:

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

現在dtypethe_problem不是一個對象,並可以有效地計算例如作為分the_problem.min() 如果使用子類numpy數組的列表,則無法執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM