簡體   English   中英

如何更高效地提取自定義類型的 numpy 數組的值?

[英]How to extract values of numpy array of a customized type more efficiently?

假設我已經定義了一個數據類型,如下所示:

class mytype(object):
    def __init__(self, x=1, y=2, z=3):
        self.x = x
        self.y = y 
        self.z = z 

我有一個 mytype 類型的 numpy 數組,定義為:

my_array = np.array([mytype()]*1000)

我的問題是:如何有效地提取上面定義的 numpy 數組的值並將其設置為 np.float64 類型的 numpy 數組? 我發現當數組很大時使用列表理解非常慢,我想一定有一些好的方法來完成這項工作。 誰能幫我嗎

Numpy 速度很快,因為它幾乎是純 C 代碼,在 C 上運行計算。 由於 C arrays 東西需要整潔干凈; 比如我們使用了多少空間? 該空間的物體大小是多少?我們有多少物體? 等當您創建任意 python 對象(可以具有動態大小)的集合,然后想要獲取該對象集合並將其放入 numpy 數組中時,每個 ZA8CFDE6331BD59EB2AC96F8911C4B666'Z 都需要找到並轉換為t真的無論如何。

my_array = np.array([mytype() for _ in range(1000)])

這基本上是 1000 個指向任意對象的指針。 Numpy 對這些對象一無所知,除了在哪里向 python 詢問有關這些對象的更多信息。 因此,上述陣列沒有 C 代碼來加快處理速度。 它幾乎等同於一個列表:

my_array = [mytype() for _ in range(1000)]

如果你想讓你的代碼更快,你不應該用任意對象制作 numpy 數組。 同樣,當您真正需要 float64 時,不應使用 python 整數(可以是任何大小並且有很多開銷)。 例如,您的 class 可以更新:

class mytype(object):
    def __init__(self, x=1, y=2, z=3):
        self.data = np.array([x,y,z],dtype='float64')

At least now each self.data could be accessed and hstacked, and since numpy knows the exact size and shape of each object, then numpy could probably gather up all the 1000 places in memory and copy them into a new array quite quickly.

根據此處的 Numpy 文檔, numpy.array調用 object 的__array__方法。 因此,您可以將任意轉換定義為numpy.array ,例如:

class mytype(object):
    def __init__(self, x=1, y=2, z=3):
        self.x = x
        self.y = y 
        self.z = z 

    def __array__(self):
        return np.array([self.x, self.y, self.z])

然后,您可以通過以下方式將單個mytype() object 轉換為np.array

tmp = mytype()
np.array(tmp)
# array([1, 2, 3])

現在,當您擁有 1000 個對象的列表時,您可以將 map np.array用於所有對象:

new_list = list(map(np.array, [mytype()]*1000))
#[array([1, 2, 3]), array([1, 2, 3]), array([1, 2, 3]), array([1, 2, 3]), ...

暫無
暫無

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

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