3D-массив Python. Вычислить R в квадрате

#python-2.7 #numpy

#python-2.7 #numpy

Вопрос:

У меня есть 2 ndarrays с 3 измерениями. Мне нужно вычислить Rsquared по этим ndarrays. Чтобы уточнить.

 Array1.shape = Array2.shape = (100, 100, 10) 
 

Итак…

 resultArray = np.ones(100*100).reshape(100,100)

for i in range(Array1.shape[0]:
    for j in range(Array1.shape[1]: 
        slope, intercept, r_value, p_value, std_err = scipy.stats.stats.linregress(Array1[i:i 1,j:j 1,:],Array1[i:i 1,j:j 1,:])
        R2 = r_value**2
        result[ i , j ] = R2
 

Ответ №1:

Если передано два массива, stats.linregress ожидается, что два массива будут одномерными.

Array1[i:i 1,j:j 1,:] имеет форму (1, 1, 10) , поэтому он трехмерный. Поэтому вместо этого используйте Array1[i, j, :] :

 import numpy as np
import scipy.stats as stats

Array1 = np.random.random((100, 100, 10))
Array2 = np.random.random((100, 100, 10))
resultArray = np.ones(100*100).reshape(100,100)
for i in range(Array1.shape[0]):
        for j in range(Array1.shape[1]):
            slope, intercept, r_value, p_value, std_err = stats.linregress(
                Array1[i, j, :],
                Array1[i, j, :])
            R2 = r_value**2
            resultArray[ i , j ] = R2

print(resultArray)
 

Комментарии:

1. Спасибо unutbu. Способ, который я написал, работает, мои входные данные были неверными, но я оставлю ваше предложение, поскольку ваш код чище моего.

2. @wfoschiera не забывайте, что вы можете принять ответ, нажав на стрелку слева, если хотите…

3. Спасибо, Саулло. Итак, у меня все еще есть проблема со временем для обработки всех моих данных. Я говорю о более чем 6000 массивах с формой (800,870,10) в целом. Любая идея будет оценена по достоинству.

4. @wfoschiera: NumPy дает преимущество в скорости, когда вы выгружаете много вычислений за один вызов функции NumPy. Здесь вы вызываете linregress крошечные массивы длиной 10 сотни тысяч или, возможно, миллионы раз. Это рецепт медлительности. Я не вижу очевидного способа получить преимущество в скорости с помощью NumPy, поскольку я не вижу способа объединить работу, выполняемую многими вызовами linregress, в один вызов. Однако, если вы опубликуете еще один вопрос, показывающий ваш код (со всеми парами из 6000 массивов), возможно, у кого-нибудь будет предложение для вас.

5. @unutbu: Еще раз спасибо, но это сложнее. Теперь я пытаюсь написать функцию для вычисления только R в квадрате, что, на мой взгляд, умнее, чем фактический код. Я работаю с данными Modis (датчиком на платформах Terra и Aqua), чтобы извлечь некоторую статистику за 10 лет. Я постараюсь думать по-другому, если будет работать быстрее, чем сейчас, я опубликую здесь.