С 3-мерным вектором python, как мне избежать «только массивы размера 1 могут быть преобразованы в скаляры Python», возникающие из синтаксиса цикла for?

#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 ? Почему бы просто не остановиться на лоне?