[解決済み] numpyの数値配列の最速の成長方法
2023-04-02 06:48:27
質問
要求事項
- データから配列を任意に大きくしたい。
- サイズが推測できる(だいたい100~200)が、毎回配列が収まるという保証はない
- 最終的なサイズに成長したら、私はそれに対して数値計算を実行する必要があるので、最終的には2次元numpy配列になることを望みます。
- スピードは重要です。例として、300個のファイルのうち1個について、update()メソッドが4500万回呼ばれ(150sくらいかかる)、finalize()メソッドが500k回呼ばれ(合計106sかかる)・・・合計250sくらいかかる。
以下は私のコードです。
def __init__(self):
self.data = []
def update(self, row):
self.data.append(row)
def finalize(self):
dx = np.array(self.data)
その他、以下のようなコードも試しましたが......これはワザと遅くしています。
def class A:
def __init__(self):
self.data = np.array([])
def update(self, row):
np.append(self.data, row)
def finalize(self):
dx = np.reshape(self.data, size=(self.data.shape[0]/5, 5))
これがどのように呼び出されるかの模式図は以下の通りです。
for i in range(500000):
ax = A()
for j in range(200):
ax.update([1,2,3,4,5])
ax.finalize()
# some processing on ax
どのように解決するのですか?
タイミングを見て、いろいろと試してみました。
import numpy as np
-
遅いと言っている方法です。(32.094秒)
class A: def __init__(self): self.data = np.array([]) def update(self, row): self.data = np.append(self.data, row) def finalize(self): return np.reshape(self.data, newshape=(self.data.shape[0]/5, 5))
-
通常のOL Pythonのリストです。(0.308秒)
class B: def __init__(self): self.data = [] def update(self, row): for r in row: self.data.append(r) def finalize(self): return np.reshape(self.data, newshape=(len(self.data)/5, 5))
-
numpyでarraylistの実装を試みる。(0.362秒)
class C: def __init__(self): self.data = np.zeros((100,)) self.capacity = 100 self.size = 0 def update(self, row): for r in row: self.add(r) def add(self, x): if self.size == self.capacity: self.capacity *= 4 newdata = np.zeros((self.capacity,)) newdata[:self.size] = self.data self.data = newdata self.data[self.size] = x self.size += 1 def finalize(self): data = self.data[:self.size] return np.reshape(data, newshape=(len(data)/5, 5))
そして、このように時間を計りました。
x = C()
for i in xrange(100000):
x.update([i])
というわけで、普通の古いPythonのリストがかなり良いようです ;)
関連
-
[解決済み] NumPyの配列を切り詰めずに、完全に表示するにはどうしたらよいですか?
-
[解決済み] NumPyの配列で、N個の最大値のインデックスを得るには?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] リストに値が存在するかどうかを確認する最速の方法
-
[解決済み] NumPy の配列を csv ファイルにダンプする
-
[解決済み] NumPy多次元配列のi番目の列にアクセスする方法は?
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] PythonでSVGからPNGに変換する
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] Django filter queryset __in for *every* item in list
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例