Квадратный корень из отрицательного массива Python

Я знаю, что в Python есть модуль cmath для поиска квадратного корня из отрицательных чисел.

Я хотел бы знать, как сделать то же самое для массива, скажем, 100 отрицательных чисел?

3 ответа

Решение

Вы хотите перебрать элементы списка и применить sqrt функционировать на нем так. Вы можете использовать встроенную функциюmap который будет применять первый аргумент ко всем элементам второго:

lst = [-1, 3, -8]
results = map(cmath.sqrt, lst)

Другой способ с классическим пониманием списка:

lst = [-1, 3, -8]
results = [cmath.sqrt(x) for x in lst]

Пример исполнения:

>>> lst = [-4, 3, -8, -9]
>>> map(cmath.sqrt, lst)
[2j, (1.7320508075688772+0j), 2.8284271247461903j, 3j]
>>> [cmath.sqrt(x) for x in lst]
[2j, (1.7320508075688772+0j), 2.8284271247461903j, 3j]

Если вы используете Python 3, возможно, вам придется применить list() на результат карты (или у вас будет объект ietrator)

import cmath, random

arr = [random.randint(-100, -1) for _ in range(10)]
sqrt_arr = [cmath.sqrt(i) for i in arr]
print(list(zip(arr, sqrt_arr)))

Результат:

[(-43, 6.557438524302j), (-80, 8.94427190999916j), (-15, 3.872983346207417j), (-1, 1j), (-60, 7.745966692414834j), (-29, 5.385164807134504j), (-2, 1.4142135623730951j), (-49, 7j), (-25, 5j), (-45, 6.708203932499369j)]

Если скорость является проблемой, вы можете использовать numpy:

import numpy as np
a = np.array([-1+0j, -4, -9])   
np.sqrt(a)
# or: 
a**0.5

результат:

array([ 0.+1.j,  0.+2.j,  0.+3.j])
Другие вопросы по тегам