#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 лет. Я постараюсь думать по-другому, если будет работать быстрее, чем сейчас, я опубликую здесь.