Там какой-либо путь состоит в том, чтобы найти среднее арифметическое “лучше”, чем сумма ()/N?

callable(x) будет возвращать true, если объект передал, может быть назван в Python, но функция не существует в Python 3.0, и правильно разговор не будет различать:

class A(object):
    def __call__(self):
        return 'Foo'

def B():
    return 'Bar'

a = A()
b = B

print type(a), callable(a)
print type(b), callable(b)

Вы доберетесь <class 'A'> True и <type function> True, как произведено.

isinstance работы отлично, чтобы определить, является ли что-то функцией (попытка isinstance(b, types.FunctionType)); если Вы действительно интересуетесь знанием, если что-то можно назвать, можно или использовать hasattr(b, '__call__') или просто попробовать его.

test_as_func = True
try:
    b()
except TypeError:
    test_as_func = False
except:
    pass

Это, конечно, не скажет Вам, является ли это вызываемым, но бросает TypeError, когда это выполняется или не является вызываемым во-первых. Это не может иметь значения для Вас.

19
задан 2 revs, 2 users 98% 28 August 2009 в 13:03
поделиться

5 ответов

Кнут перечисляет следующий метод вычисления среднего и стандартного отклонения с плавающей запятой (оригинал на стр. 232 в Том 2 книги «Искусство компьютерного программирования» , издание 1998 г .; моя адаптация, приведенная ниже, избегает использования специального регистра в первой итерации):

double M=0, S=0;

for (int i = 0; i < N; ++i)
{
    double Mprev = M;
    M += (x[i] - M)/(i+1);
    S += (x[i] - M)*(x[i] - Mprev);
}

// mean = M
// std dev = sqrt(S/N) or sqrt(S/N+1)
// depending on whether you want population or sample std dev
30
ответ дан 30 November 2019 в 02:27
поделиться

Если большие целые числа являются проблемой ... это нормально

a/N + b/N+.... n/N

Я имею в виду, что вы ищете просто другие способы или оптимальный?

3
ответ дан 30 November 2019 в 02:27
поделиться

Если массив представляет собой данные с плавающей запятой, даже «простой» алгоритм страдает ошибкой округления. Интересно, что в этом случае блокирование вычислений в суммах sqrt (N) длины sqrt (N) фактически уменьшает ошибку в среднем случае (даже если выполняется такое же количество округлений с плавающей запятой).

Для целочисленных данных обратите внимание, что вы не делаете этого. не нужны общие «большие целые числа»; если в вашем массиве менее 4 миллиардов элементов (вероятно), вам нужен только целочисленный тип на 32 бита больше, чем тип данных массива. Выполнение сложения для этого немного большего типа всегда будет быстрее, чем выполнение деления или модуля для самого типа. Например, в большинстве 32-битных систем 64-битное сложение выполняется быстрее, чем 32-битное деление / модуль. Этот эффект будет только усиливаться по мере увеличения типов.

если в вашем массиве менее 4 миллиардов элементов (вероятно), вам нужен только целочисленный тип на 32 бита больше, чем тип данных массива. Выполнение сложения для этого немного большего типа всегда будет быстрее, чем выполнение деления или модуля для самого типа. Например, в большинстве 32-битных систем 64-битное сложение выполняется быстрее, чем 32-битное деление / модуль. Этот эффект будет только усиливаться по мере увеличения типов.

если в вашем массиве менее 4 миллиардов элементов (вероятно), вам нужен только целочисленный тип на 32 бита больше, чем тип данных массива. Выполнение сложения для этого немного большего типа всегда будет быстрее, чем выполнение деления или модуля для самого типа. Например, в большинстве 32-битных систем 64-битное сложение выполняется быстрее, чем 32-битное деление / модуль. Этот эффект будет только усиливаться по мере увеличения типов.

3
ответ дан 30 November 2019 в 02:27
поделиться

Если вы используете float , вы можете избежать больших целых чисел:

def simple_mean(array[N]):
    sum = 0.0 # <---
    for i = 1 to N
       sum += array[i]
    return sum / N
1
ответ дан 30 November 2019 в 02:27
поделиться

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

sum = 0
rest = 0
for num in numbers:
  sum += num / N
  rest += num % N
  sum += rest / N
  rest = rest % N

return sum, rest
17
ответ дан 30 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

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