У меня есть очень (очень, очень) большой двумерный массив - порядка тысячи столбцов, но несколько миллионов строк (достаточно, чтобы он не вписывался в память на моей 32-гигабайтной машине). Я хочу вычислить дисперсию каждой из тысяч столбцов. Один из ключевых фактов, который помогает: мои данные - 8-битные беззнаковые int.Эффективно индексируя массив numpy с массивом numpy
Вот как я планирую приблизиться к этому. Сначала я построю новый двухмерный массив, называемый , числом с формой (1000, 256), с идеей, что counts[i,:] == np.bincount(bigarray[:,i])
. Как только у меня будет этот массив, для вычисления дисперсии будет тривиально.
Проблема в том, что я не уверен, как ее эффективно вычислить (это вычисление должно выполняться в режиме реального времени, и я бы хотел, чтобы пропускная способность ограничивалась тем, насколько быстро мой SSD может вернуть данные). Вот что-то, что работает, но ужасно ужасно:
counts = np.array((1000,256))
for row in iterator_over_bigaray_rows():
for i,val in enumerate(row):
counts[i,val] += 1
Есть ли способ написать это, чтобы работать быстрее? Что-то вроде этого:
counts = np.array((1000,256))
for row in iterator_over_bigaray_rows():
counts[i,:] = // magic np one-liner to do what I want
+1 Умный способ борьбы с огромным массивом! Но вам все равно придется перебирать много строк ... – Jaime
Да, но этого не избежать. Я на самом деле не перебираю его (я загружаю его с диска в блоки, а затем перебираю по блокам асинхронно). –