簡體   English   中英

如何有效地設置 Numpy 數組?

[英]How to turn Numpy array to set efficiently?

我用了:

df['ids'] = df['ids'].values.astype(set)

lists轉換為sets ,但輸出是列表而不是集合:

>>> x = np.array([[1, 2, 2.5],[12,35,12]])

>>> x.astype(set)
array([[1.0, 2.0, 2.5],
       [12.0, 35.0, 12.0]], dtype=object)

有沒有一種有效的方法可以將列表轉換為Numpy集合?

編輯 1:
我的輸入如下所示:
我有 3,000 條記錄。 每個都有 30,000 個 ID:[[1,...,12,13,...,30000], [1,...,43,45,...,30000],...,[...] ]

首先展平 ndarray 以獲得一維數組,然后在其上應用 set() :

set(x.flatten())

編輯:由於您似乎只想要一個集合數組,而不是整個數組的集合,那么您可以執行value = [set(v) for v in x]來獲取集合列表。

您問題的當前狀態(可以隨時更改):如何有效地從大型數組的大型數組中刪除唯一元素?

import numpy as np

rng = np.random.default_rng()
arr = rng.random((3000, 30000))
out1 = list(map(np.unique, arr))
#or
out2 = [np.unique(subarr) for subarr in arr]

IPython shell 中的運行時:

>>> %timeit list(map(np.unique, arr))
5.39 s ± 37.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

>>> %timeit [np.unique(subarr) for subarr in arr]
5.42 s ± 58.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

更新:正如@hpaulj在他的評論中指出的那樣,我的虛擬示例是有偏見的,因為浮點隨機數幾乎肯定是唯一的。 所以這里有一個更逼真的整數示例:

>>> arr = rng.integers(low=1, high=15000, size=(3000, 30000))

>>> %timeit list(map(np.unique, arr))
4.98 s ± 83.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

>>> %timeit [np.unique(subarr) for subarr in arr]
4.95 s ± 51.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

在這種情況下,輸出列表的元素具有不同的長度,因為要刪除實際的重復項。

幾個較早的“按行”的獨特問題:

對子數組唯一的向量化 numpy

Numpy:行明智的獨特元素

在ndarray中按行計算唯一元素

在其中的幾個中,計數比實際的唯一值更有趣。

如果每行唯一值的數量不同,則結果不能是 (2d) 數組。 這是一個很好的跡象,表明問題不能完全矢量化。 您需要對行進行某種迭代。

暫無
暫無

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

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