Ошибка (только массивы размера 1 могут быть преобразованы в скаляры Python) при попытке расчета максимального значения - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь вычислить максимумы из приведенного ниже кода, но получаю ошибку как TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python

Input_list = [1,9,96,9,7,4,3,77,0,2,3,4,5].

Пожалуйста, помогите

import ast,sys
import numpy as np
input_str = sys.stdin.read()
input_list = ast.literal_eval(input_str)

from scipy.signal import argrelextrema

Ar=np.array(input_list)
maximas=argrelextrema(Ar, np.greater) #store your final list here
maximas=[int(x) for x in maximas] #do not change this code, the output should be an integer list for evaluation purposes
print(maximas)

Ответы [ 3 ]

1 голос
/ 02 мая 2019

argrelextrema возвращает кортеж, содержащий массивы (https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.argrelextrema.html). В вашем случае вы, вероятно, хотите получить доступ к первому элементу этого кортежа, поэтому что-то вроде

maximas=[int(x) for x in maximas[0]]
0 голосов
/ 03 мая 2019
In [295]: from scipy.signal import argrelextrema                                                                           
In [296]: Ar = np.array([1,9,96,9,7,4,3,77,0,2,3,4,5])                               
In [297]: maximas=argrelextrema(Ar, np.greater)                                      

Когда вы спрашиваете об ошибке, вы должны показать все сообщение об ошибке или, по крайней мере, достаточно, чтобы вы и мы знали, где это произошло.Это полезная информация.

In [300]: [int(x) for x in maximas]                                                  
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-300-0250728a7b76> in <module>
----> 1 [int(x) for x in maximas]

<ipython-input-300-0250728a7b76> in <listcomp>(.0)
----> 1 [int(x) for x in maximas]

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

Скорее всего, ошибка в вызове int(), поскольку int предназначен для возврата одного целого числа либо из строки, либо из числового ввода.,Ошибка указывает, что x был массивом с более чем одним значением.

Посмотрите на maximas:

In [301]: maximas                                                                    
Out[301]: (array([2, 7]),)

Это кортеж, содержащий один массив.Таким образом, итерация для этого кортежа создаст массив.

Мы можем выбрать массив из кортежа с индексированием:

In [302]: maximas[0]                                                                 
Out[302]: array([2, 7])
In [303]: maximas[0].tolist()   # convert it to a list                                                        
Out[303]: [2, 7]
In [304]: maximas[0].astype(int).tolist()   # ensure it's integers                                         
Out[304]: [2, 7]

Согласно документам, результат argrelextrema является кортежем,один массив на измерение ввода.Фактически код показывает, что он возвращает np.nonzero(results).Чаще мы используем псевдоним np.where(results).

Использовать int(x) не было необходимости.maximas массивы целочисленные, индексы.

Возможно, вам не нужно конвертировать maximas в список.Результат np.where часто можно использовать непосредственно при индексации, например:

In [307]: Ar                                                                         
Out[307]: array([ 1,  9, 96,  9,  7,  4,  3, 77,  0,  2,  3,  4,  5])
In [308]: Ar[maximas]                                                                
Out[308]: array([96, 77])

===

Имейте в виду, что если входной массив 2d, maximas будеткортеж из 2 элементов.

In [312]: Be = Ar[:12].reshape(6,2)      # 2d array                        
In [313]: argrelextrema(Be, np.greater)                                              
Out[313]: (array([1, 3]), array([0, 1]))    # 2 element tuple
In [314]: Be[_]              # using the tuple to index Be                                               
Out[314]: array([96, 77])
0 голосов
/ 02 мая 2019

Согласно документам , функция scypy.signal.argrelaxtrema возвращает набор массивов, с одним значением для каждого измерения входных данных. Если ввод одномерный, вы получите 1 кортеж обратно.

Я подозреваю, что вы можете исправить свой код с помощью maximas = argrelextrema(Ar, np.greater)[0], или, возможно, maximas, = argrelextrema(Ar, np.greater) (обратите внимание на запятую после имени переменной, что делает ее распаковкой!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...