[英]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_class
為numpy.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'>
此外,如果生成的聚合是一個非類型為object
的numpy
數組,那么將numpy數組子類化並將它們中的許多聚合成一個更大的數組(如the_problem
所報告的the_problem
是很有用的。
例如,假設array_1
和array_2
具有相同的形狀:
shape = (2,3)
array_1 = InfoArray(shape)
array_2 = InfoArray(shape)
the_problem = numpy.array([array_1, array_2])
現在dtype
的the_problem
不是一個對象,並可以有效地計算例如作為分the_problem.min()
如果使用子類numpy
數組的列表,則無法執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.