#python #arrays #numpy
Вопрос:
Мой (фактический) код находит средние значения скорости ветра с востока на запад (т. Е. среднюю скорость ветра, усредненную по каждой долготе на одной широте), но сейчас меня нет рядом с этим, поэтому я воспроизвел его ниже. По сути, проблема возникает из следующего фрагмента кода:
time = [] lat = range(-90, 90) lon = range(0, 180) u10m = np.random.randint(-10, 20, (len(time),len(lat),len(lon))) psum = 0 u_zavg = np.zeros(len(lat)) print(time) for i in range(len(lat)): for j in range(len(lon)): psum = u10m[:,i,j] u_zavg[i] = psum/len(lon) psum = 0
с ошибкой, возвращаемой в
u_zavg[i] = psum/len(lon).
Я почти уверен, что это связано с временным измерением моей переменной. Есть ли какой-нибудь способ обойти это? Я пробовал пару вещей, таких как добавление l = sum(k, axis = 0)
, а затем использование l
вместо psum
в i
цикле, но это не очень помогло.
psum
предполагается, что это сумма всех значений на каждой долготе ( j
) вдоль одной широты ( i
), поэтому она должна возвращать одно число. u_zavg[i]
ДОЛЖНО быть среднее значение всех этих значений, но в настоящее время он получает вектор из-за : (по крайней мере, это мое предположение). Есть какие-нибудь идеи, как это исправить?
Комментарии:
1. Если вы не объясните, что должен был делать ваш код, мы не сможем рассказать вам, как заставить ваш код это делать.
2. Что вы пытались заставить свой код делать, когда писали
u_zavg[i] = psum/len(lon)
?
Ответ №1:
Полное сообщение об ошибке
TypeError: only size-1 arrays can be converted to Python scalars The above exception was the direct cause of the following exception: Traceback (most recent call last): File "lt;ipython-input-25-aab34ac00f59gt;", line 11, in lt;modulegt; u_zavg[i] = psum/len(lon) ValueError: setting an array element with a sequence.
Посмотрите на оставшиеся значения (я использую интерактивный сеанс Ipython).:
In [36]: psum Out[36]: array([], dtype=int64) In [37]: lon Out[37]: range(0, 180) In [38]: len(lon) Out[38]: 180 In [39]: psum/len(lon) Out[39]: array([], dtype=float64) In [42]: u_zavg.shape Out[42]: (180,) In [43]: u_zavg[i] Out[43]: 0.0
Вы пытаетесь назначить массив (0,) фигур слоту, который ожидает одно значение.
В то время psum
как начинается 0
, вы добавляете к нему что — то-кусочек u10m
:
In [45]: u10m Out[45]: array([], shape=(0, 180, 180), dtype=int64) In [46]: len(time) Out[46]: 0 In [47]: u10m[:,i,j] Out[47]: array([], dtype=int64)
Вы начинаете с time
as []
, поэтому u10m
имеет 0 измерений!
При построении кода, подобного этому, тестируйте и снова тестируйте. Убедитесь, что вы понимаете и проверяете каждый шаг. Вы проверили форму u10m
?
len(lon)
это не обычная конструкция, хотя она работает нормально, если предположить, что вы этого хотите.
Комментарии:
1. таким образом, для исходных данных
time
это «бесконечное» измерение (его можно добавить, в то время как lon и lat не могут быть), так что это просто [ ], как у меняtime
здесь. я неправильно истолковал ваш ответ или я могу что-то для этого сделать?2.
time
к этому списку можно добавить. Ноu10m
как созданное имеет первое измерение 0. Это сразу же создает вам проблему. Я сосредотачиваюсь на том, что происходит, а не на ваших желаниях.3. ах, хорошо, как я должен решить
u10m
проблему с первым измерением 0?4. Зачем ему вообще нужно начальное измерение,0,1 или
n
? Почему бы просто не остановиться на лоне?