1 Востаннє редагувалося dialectstat (25.07.2017 14:32:02)

Тема: питання по Numpy

Маю масив z, якщо я хочу порахувати для кожного елементу масиву експоненту, то роблю так

def lala(z):
    return np.exp(z)

як мені компактно для кожного елементу масиву записати:

def lala(z):
    if z<-5:
        return 0.
    elif z>5:
        return 1.
    else:
        x2=z*z
        x3=x2*z
        return x2+x3 

Бо ивдає помилку

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

2 Востаннє редагувалося ping (25.07.2017 14:52:36)

Re: питання по Numpy

якщо z це масив, то яким макаром Ви хочете його в другій функції порівнювати з числом?

в першій функції все зрозуміло:

numpy.exp(x[, out]) = <ufunc 'exp'>¶

    Calculate the exponential of all elements in the input array.
    Parameters:   

    x : array_like

        Input values.

    Returns:   

    out : ndarray

        Output array, element-wise exponential of x.

3

Re: питання по Numpy

ping написав:

якщо z це масив, то яким макаром Ви хочете його в другій функції порівнювати з числом?

я кожен елемент хочу порівнювати і кожномо елементу повернути певне значення, перша функція ж працює з таким самим масивом.

4 Востаннє редагувалося ping (25.07.2017 15:10:19)

Re: питання по Numpy

dialectstat написав:
ping написав:

якщо z це масив, то яким макаром Ви хочете його в другій функції порівнювати з числом?

я кожен елемент хочу порівнювати і кожномо елементу повернути певне значення, перша функція ж працює з таким самим масивом.

перша функція приймає на вхід масив і повертає масив. і, якщо Ви глянете її код, то там не буде порівння масиву з числом, а буде порівняння елементу масива з числом.


а Вам здаєьтся треба отаке:

https://docs.scipy.org/doc/numpy/refere … orize.html
class numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)[source]¶

    Generalized function class.

    Define a vectorized function which takes a nested sequence of objects or numpy arrays as inputs and returns an single or tuple of numpy array as output. The vectorized function evaluates pyfunc over successive tuples of the input arrays like the python map function, except it uses the broadcasting rules of numpy.

    The data type of the output of vectorized is determined by calling the function with the first element of the input. This can be avoided by specifying the otypes argument.

>>> def myfunc(a, b):
...     "Return a-b if a>b, otherwise return a+b"
...     if a > b:
...         return a - b
...     else:
...         return a + b

>>> vfunc = np.vectorize(myfunc)
>>> vfunc([1, 2, 3, 4], 2)
array([3, 4, 1, 2])

5

Re: питання по Numpy

А простий map не підійде?

6

Re: питання по Numpy

koala написав:

А простий map не підійде?

А мап опрацє н-розмірний масив?

7 Востаннє редагувалося dialectstat (26.07.2017 16:26:48)

Re: питання по Numpy

koala написав:

А простий map не підійде?

Як туди return 0. запхати?

def lala(z):
    map(lambda x: return 0. if x < -5, z)

Дає SyntaxError: invalid syntax на return 0.

8

Re: питання по Numpy

А нащо ви return в лямбду пхаєте?

def lala(z):
        return map(lambda x: 0 if x < -5 else 1 if x>=5 else x**2+x**3, z)

9

Re: питання по Numpy

koala написав:

А нащо ви return в лямбду пхаєте?

def lala(z):
        return map(lambda x: 0 if x < -5 else 1 if x>=5 else x**2+x**3, z)

Видає
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

z це двохмірний масив

10

Re: питання по Numpy

dialectstat написав:

z це двохмірний масив


я ж навів практично Ваш випадок - хіба не працює?

або дайте скорочений варіант ВАшого масиву сюди