Трансляция DataFrames по измерениям массива NumPyPython

Программы на Python
Ответить
Anonymous
 Трансляция DataFrames по измерениям массива NumPy

Сообщение Anonymous »

Я работаю с большим DataFrame Pandas и многомерным массивом NumPy. Моя цель — эффективно «транслировать» определенный столбец DataFrame по одному или нескольким измерениям массива NumPy, выполняя поэлементную операцию.
Предположим, у меня есть DataFrame df следующим образом:

Код: Выделить всё

import pandas as pd
import numpy as np

data = {'id': range(100), 'value': np.random.rand(100)}
df = pd.DataFrame(data)
И массив NumPy с формой (10, 5, 100, 20):

Код: Выделить всё

arr = np.random.rand(10, 5, 100, 20)
Я хочу умножить df['value'] на arr так, чтобы df['value'] умножалось на arr[:, :, i, :] для всех i. По сути, df['value'] должен соответствовать третьему измерению arr.
Решение может включать итерацию или использование np.apply_along_axis, что часто бывает медленным для больших массивов:

Код: Выделить всё

result_slow = np.zeros_like(arr)
for i in range(df.shape[0]):
result_slow[:, :, i, :] = arr[:, :, i, :] * df['value'].iloc[i]
Это работает, но для гораздо большего arr (например, миллионов в третьем измерении) и df это становится затратным в вычислительном отношении.
Как я могу эффективно решить это умножение, используя широковещательную рассылку NumPy без явных циклов или apply_along_axis, чтобы умножить столбец df['value'] вдоль определенной оси (в данном случае 3-й оси) массива NumPy?
Я ищу решение, которое не только хорошо работает с большими наборами данных, но и эффективно использует память.

Подробнее здесь: https://stackoverflow.com/questions/798 ... dimensions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»