我有一個用例,我將其簡化為以下問題:
import numpy as np
def get_matrix(i): # get a matrix N * M
return (
(i, i 1, i 1.2),
(i 1, i / 2, i * 3.2),
(i / 3, i * 2, i / 4),
(i / 5, i * 2.1, i 2.2),
)
K = 10000
# build a n-d array K * N * M
arr = np.array(
tuple(get_matrix(i) for i in range(K)),
np.float32,
)
但是,當我想獲取K*N*Mnumpy 陣列時,我需要創建一個帶有 shape 的臨時元組K*N*M。只有在構建了 numpy 陣列時,才能對元組進行垃圾收集。因此上面的結構有額外的空間O(K*N*M)。
如果我可以從 iterator 創建 numpy 陣列(get_matrix(i) for i in range(K)),那么每個矩陣N*M在使用時都可以被垃圾收集。因此額外的空間是O(N*M)。
我發現有一個方法numpy.fromiter(),但我不知道如何寫dtype,因為在最后一個類似的例子。
import numpy as np
K = 10000
# build a n-d array K * N * M
arr = np.fromiter(
(get_matrix(i) for i in range(K)),
dtype=np.float32, # there is error
)
uj5u.com熱心網友回復:
啊,所以這是np.fromiter. 只是通過檔案中的示例,以下作業:
K = 10000
N = 4
M = 3
# build a n-d array K * N * M
arr = np.fromiter(
(get_matrix(i) for i in range(K)),
dtype=np.dtype((np.float32, (N, M))),
count=K
)
請注意,我使用該count引數進行了很好的衡量,但沒有它也可以作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/528660.html
標籤:Python麻木的
上一篇:使用Pandas將一個資料集的值與另一個資料集進行棘手的更新(有條件)
下一篇:創建隨機布爾陣列
