не считается ковариация между двумя выборками из распределений из scipy.stats

Задача состоит в том чтобы посчитать ковариацию между двумя выборками из двух распределений (равномерного и распределения Максвелла). В задании предлагается использовать библиотеку numpy чтобы посчитать ковариацию. При запуске кода возникает такая ошибка:

TypeError: only size-1 arrays can be converted to Python scalars

Я предполагаю что проблема в типе массива, который создается при генерации выборки, он каким то образом создается с размерностью большей чем один (понятно из типа ошибки), а функция ковариации np.cov из базовой библиотеки numpy разработана так, чтобы не работать с типами данных из scipy (поразительная кроссплатформенность).

В документации ковариации np.cov приводятся примеры с искусственным созданием массивов, на всех других сайтах, что я проглядел, приводится просто перевод с документации, соответственно ни одного комментария по тому как работать с типами данных из функций генерации выборок распределений из библиотеки scipy нигде нет.

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

Вот что я написал и что у меня не работало:

import scipy.stats as sps
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

# генерируем выборку из 1000 элементов равномерного распределения
uni_distr = sps.uniform.rvs(size = 1000)

# генерируем выборку из 1000 элементов распределения Максвелла
max_distr = sps.maxwell.rvs(size = 1000)
#print(max_distr)

#считаем выборочную ковариацию и корреляцию между полученными выборками
#Z = np.sum(uni_distr, max_distr) 
#Z = np.vstack((uni_distr, max_distr))
#print(Z)
print('Выборочная ковариация: %.3f' % np.cov(max_distr, uni_distr))
#print('Выборочная корреляция: %.3f' % np.correlate(max_distr, uni_distr))

Ответы (1 шт):

Автор решения: CrazyElf
print('Выборочная ковариация: %.3f' % np.cov(max_distr, uni_distr))

TypeError: only size-1 arrays can be converted to Python scalars

Дело в том, что np.cov выдаёт матрицу (Estimate a covariance matrix, given data and weights.), а вы пытаетесь эту матрицу напечатать как одно число в формате %.3f, вот питон и ругается. Напечатать матрицу можно так:

print('Выборочная ковариация:\n', np.cov(max_distr, uni_distr))

Или лучше, если у вас свежий питон, с помощью f-string:

print(f'Выборочная ковариация:\n{np.cov(max_distr, uni_distr)}')

Вывод:

Выборочная ковариация:
[[0.4798678  0.00347072]
 [0.00347072 0.08130409]]

Как трактовать эту матрицу, или что из неё вам нужно брать я не знаю - я не статистик, я программист. :)

Так что данные между пакетами прекрасно совместимы, большинство математических и статистических пакетов питона обычно использует именно библиотеку numpy и её типы данных у себя внутри, потому что это быстро и удобно.

→ Ссылка