Используя Numpy для нахождения среднего значения через наборы данных, с некоторыми недостающими данными

Одна вещь упомянуть также. У Вас уже есть база пользователей с OpenID, они просто должны войти в систему.

5
задан Lemur 20 November 2009 в 21:29
поделиться

3 ответа

Почему бы просто не использовать numpy's ma ( masked array) module?

maxLen = reduce(lambda a,b : max(a, b.shape[0]),
                dSets, 0)
all = N.ma.zeros((maxLen,)+ dSets[0].shape[1:] + (len(dSets),),
                     dtype=float)      # set the dtype to whatever
all.mask = True
for i, set in enumerate(dSets):
    all.mask[:len(set),...,i] = False
    all[:len(set),...,i] = set

mean = all.mean(axis=-1)

Конечно, это работает, только если вы можете гарантировать, что время в каждой строке одинаково для всех массивов, т.е. set [i, 0] == set [j, 0] для всех i, j

3
ответ дан 14 December 2019 в 19:17
поделиться

Изменить: я изменил свой метод, отказавшись от scipy.nanmean в пользу замаскированных массивов.

Если это неясно что код делает в любой момент, сначала попробуйте поставить напечатайте инструкции. Если это все еще неясно, не стесняйтесь спрашивать; Я постараюсь объяснить. Уловка состоит в том, чтобы объединить t-значения. (Это было сделано с помощью метода searchsorted массива numpy.)

Игра с numpy привела меня к мысли, что его преимущества в скорости могут не существовать, пока наборы данных не станут достаточно большими (возможно, вам понадобится не менее 10 000 строк на набор данных). В противном случае решение на чистом питоне может быть проще в написании и быстрее.

Вот наборы данных игрушек, которые я использовал:

% cat set1
1, 10, 50
2, 13, 58
3,9,43
4,14,61
7, 4, 82

% cat set2
1, 12, 48
2, 7, 60
3,17,51
4,12,57
7,10,88
8,15,92
9,6,63

А вот код:

#!/usr/bin/env python
import numpy as np

filenames=('set1','set2')   # change this to list all your csv files
column_names=('t','a','b')

# slurp the csv data files into a list of numpy arrays
data=[np.loadtxt(filename, delimiter=',') for filename in filenames]

# Find the complete list of t-values
# For each elt in data, elt[a,b] is the value in the a_th row and b_th column
t_values=np.array(list(reduce(set.union,(set(elt[:,0]) for elt in data))))
t_values.sort()
# print(t_values)
# [ 1.  2.  3.  4.  7.  8.  9.]

num_rows=len(t_values)
num_columns=len(column_names)
num_datasets=len(filenames)

# For each data set, we compute the indices of the t_values that are used.
idx=[(t_values.searchsorted(data[n][:,0])) for n in range(num_datasets)]

data2=np.ma.zeros((num_rows,num_columns,num_datasets))
for n in range(num_datasets):
    data2[idx[n],:,n]=data[n][:,:]
data2=np.ma.masked_equal(data2, 0)
averages=data2.mean(axis=-1)
print(averages)
# [[1.0 11.0 49.0]
#  [2.0 10.0 59.0]
#  [3.0 13.0 47.0]
#  [4.0 13.0 59.0]
#  [7.0 7.0 85.0]
#  [8.0 15.0 92.0]
#  [9.0 6.0 63.0]]
2
ответ дан 14 December 2019 в 19:17
поделиться

Что ж, один из способов сделать это - перебрать каждую строку каждого набора данных и добавить заданное значение столбца в массив, который хранится в словаре, где индекс времени используется для его значения ключа. Затем вы перебираете словарь и извлекаете среднее значение для каждого хранимого в нем массива.

Это не особенно эффективно - другой вариант - найти самый длинный массив, перебрать его и запросить другие наборы данных, чтобы создать временный массив для усреднения. Таким образом вы сохраните вторичную итерацию по словарю.

0
ответ дан 14 December 2019 в 19:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: