Квадрат списка (или массива?) чисел в Python

Я исхожу из фона MATLAB, и эта простая операция до сих пор кажется чрезвычайно сложной для реализации в Python, согласно ответам в других стеках. Как правило, в большинстве ответов используется цикл for.

Лучшее, что я видел до сих пор, это

import numpy
start_list = [5, 3, 1, 2, 4]
b = list(numpy.array(start_list)**2)

Есть ли более простой способ?


person user1936752    schedule 29.02.2016    source источник
comment
Почему бы просто не использовать массив numpy?   -  person Padraic Cunningham    schedule 29.02.2016
comment
@PadraicCunningham: я не думаю, что этот вопрос касается numpy (хотя он был помечен как таковой). Я думаю, что способ numpy был самым компактным, найденным OP.   -  person user16538    schedule 29.02.2016
comment
Я добавил тег numpy, исходный вопрос импортирует numpy и использует numpy.array, также OP говорит, что исходит из фона MATLAB, кажется подходящим IMO.   -  person bakkal    schedule 29.02.2016
comment
@user16538. OP уже использует numpy и, похоже, выполняет числовые вычисления, поэтому он определенно связан с numpy, и было бы гораздо разумнее просто использовать массивы numpy, если нет какой-то конкретной причины, по которой они не могут.   -  person Padraic Cunningham    schedule 29.02.2016
comment
Предлагаемый дубликат, который я связал, действителен только для ответов vanilla Python (понимание списка, карта + лямбда) и т. д. Это недействительно для numpy.   -  person bakkal    schedule 29.02.2016
comment
NumPy — это определенно инструмент, который вам нужен для работы в стиле Matlab на Python. Я нашел docs.scipy.org/doc/ numpy-dev/user/numpy-for-matlab-users.html очень помог, когда я переключился.   -  person mtrw    schedule 29.02.2016
comment
Я изучаю Python, ребята, и прошла всего неделя. Но все же меня удивляет, что хотя MATLAB может просто сделать x.^2, в Python нет такой простой вещи.   -  person user1936752    schedule 01.03.2016
comment
Используйте ТОЛЬКО это: myarray ** 2   -  person seralouk    schedule 27.11.2019


Ответы (4)


Наиболее читаемым, вероятно, является понимание списка:

start_list = [5, 3, 1, 2, 4]
b = [x**2 for x in start_list]

Если вы функциональный тип, вам понравится map:

b = map(lambda x: x**2, start_list)  # wrap with list() in Python3
person L3viathan    schedule 29.02.2016

Примечание. Поскольку у нас уже есть дубликаты для ванильного Python, списки и сопоставления и что я не нашел дубликата для возведения в квадрат массива 1D numpy, я подумал, что оставлю свой первоначальный ответ, в котором используется numpy

numpy.square()

Если вы переходите с MATLAB на Python, вы определенно правы, пытаясь использовать для этого numpy. С numpy вы можете использовать numpy.square() который возвращает поэлементный квадрат ввода:

>>> import numpy as np
>>> start_list = [5, 3, 1, 2, 4]
>>> np.square(start_list)
array([25,  9,  1,  4, 16])

numpy.power()

Существует также более общий numpy.power()

>>> np.power(start_list, 2)
array([25,  9,  1,  4, 16])
person bakkal    schedule 29.02.2016

Просто используйте понимание списка:

start_list = [5, 3, 1, 2, 4]
squares = [x*x for x in start_list]

Примечание: в качестве небольшой оптимизации выполнение x*x выполняется быстрее, чем x**2 (или pow(x, 2)).

person Eugene Yarmash    schedule 29.02.2016

Вы можете использовать понимание списка:

[i**2 for i in start_list]

Или, если вы используете numpy, вы можете использовать tolist метод:

In [180]: (np.array(start_list)**2).tolist()
Out[180]: [25, 9, 1, 4, 16]

Или np.power:

In [181]: np.power(start_list, 2)
Out[181]: array([25,  9,  1,  4, 16], dtype=int32)
person Anton Protopopov    schedule 29.02.2016
comment
квадраты = [x*x для x в числах] вернуть отсортированные (квадраты) - person Jefferson Sankara; 07.04.2021