簡體   English   中英

如何從可迭代的元組創建多維numpy數組?

[英]How do you create a multidimensional numpy array from an iterable of tuples?

我想從iterable中創建一個numpy數組,它產生值的元組,例如數據庫查詢。

像這樣:

data = db.execute('SELECT col1, col2, col3, col4 FROM data')
A = np.array(list(data))

有沒有更快的方法這樣做,而不首先將迭代轉換為列表?

我不是一個經驗豐富的numpy用戶,但這里是一般問題的可能解決方案:

>>> i = iter([(1, 11), (2, 22)])
>>> i
<listiterator at 0x5b2de30>                    # a sample iterable of tuples
>>> rec_array = np.fromiter(i, dtype='i4,i4')  # mind the dtype
>>> rec_array                                  # rec_array is a record array
array([(1, 11), (2, 22)], 
    dtype=[('f0', '<i4'), ('f1', '<i4')])
>>> rec_array['f0'], rec_array[0]              # each field has a default name
(array([1, 2]), (1, 11))
>>> a = rec_array.view(np.int32).reshape(-1,2) # let's create a view
>>> a
array([[ 1, 11],
       [ 2, 22]])
>>> rec_array[0][1] = 23
>>> a                                          # a is a view, not a copy!
array([[ 1, 23],
       [ 2, 22]])

我假設所有列都是相同的類型,否則rec_array已經是你想要的。

關於你的具體情況,我不完全理解你的例子中的db是什么。 如果它是一個游標對象,那么你可以調用它的fetchall方法並獲得一個元組列表。 在大多數情況下,數據庫庫不希望保留部分讀取的查詢結果,等待代碼處理每一行,即execute方法返回時,所有數據都已存儲在列表中,並且幾乎沒有使用fetchall而不是迭代cursor實例的問題。

雖然從技術上講不是我的問題的答案,但我找到了一種方法來做我想做的事情:

def get_cols(db, cols):
    def get_col(col):
        data = db.execute('SELECT '+col+' FROM data', dtype=np.float64)
        return np.fromiter((v[0] for v in data))

    return np.vstack([get_col(col) for col in cols]).T

暫無
暫無

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

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