Як створити масив рівномірно розташованих чисел

Цей посібник навчить вас, як використовувати NumPy linspace() для створення масиву рівномірно розташованих чисел у Python.

Ви дізнаєтесь про синтаксис NumPy linspace(), а потім приклади, які допоможуть вам зрозуміти, як ним користуватися.

Примітка: щоб слідувати цьому підручнику, вам потрібно встановити Python і NumPy.

У вас ще немає NumPy? Ми підготували для вас короткий посібник зі встановлення.

Давайте розпочнемо!

Встановіть та імпортуйте NumPy

Перш ніж почати підручник, давайте швидко пробіжимо кроки для встановлення бібліотеки NumPy.

⏩ Якщо у вас уже встановлено NumPy, можете перейти до наступного розділу.

  • Якщо ви використовуєте Google Colab — хмарне середовище для записників Jupyter, ви можете імпортувати NumPy і почати кодувати відразу. (рекомендовано для цього підручника ✅)
  • Якщо ви хочете налаштувати локальне робоче середовище, я рекомендую встановити дистрибутив Anaconda Python. Anaconda поставляється з кількома попередньо встановленими корисними пакетами. Ви можете завантажити інсталятор для вашої операційної системи. Процес налаштування займає лише кілька хвилин.⌛
  • Якщо на вашому комп’ютері вже встановлено Python, ви все одно можете встановити дистрибутив Anaconda. Ви можете використовувати conda або pip для встановлення та керування пакетами. Ви можете виконати одну з наведених нижче команд із командного рядка Anaconda, щоб установити NumPy.
# Install NumPy using conda
conda install numpy

# Install NumPy using pip
pip install numpy

Наступним кроком імпортуйте numpy під псевдонімом np, виконавши таку команду. Це допоможе вам посилатися на NumPy як np — без необхідності вводити вниз numpy кожного разу, коли ви отримуєте доступ до елемента в модулі.

import numpy as np

Надалі ми будемо використовувати крапкову нотацію для доступу до всіх функцій у бібліотеці NumPy так: np.<назва-функції>.

Випадок рівномірних чисел

Коли ви працюєте з масивами NumPy, іноді вам потрібно буде створити масив рівномірно розташованих чисел в інтервалі.

Перш ніж йти далі, давайте швидко перейдемо до іншої схожої функції np.arange().

NumPy linspace() проти NumPy arange()

Якщо ви раніше використовували NumPy, ви, швидше за все, використовували np.arange() для створення масиву чисел у вказаному діапазоні.

Ви знаєте, що np.arange(start, stop, step) повертає масив чисел від початку до, але не включаючи зупинку, у кроках кроку; розмір кроку за замовчуванням становить 1.

Однак значення кроку не завжди може бути очевидним. Давайте розберемося, чому це так.

  Функція Python map(), пояснена на прикладах

Наприклад, якщо вам потрібні 4 рівномірно розташовані числа від 0 до 1, ви знаєте, що розмір кроку має бути 0,25. Але якщо ви використовуєте np.arange(), він не включає значення зупинки 1. Тому вам доведеться вибрати інтервал, який виходить за межі значення зупинки.

Наступне зображення ілюструє ще кілька прикладів, коли вам потрібна певна кількість рівномірно розташованих точок в інтервалі [a, b].

Рівномірно розташовані точки в інтервалі

Наш перший приклад із 4 рівномірно розташованими точками [0,1] було досить легко. Ви знаєте, що крок між точками має бути 0,25.

Припустімо, у вас є дещо складніший приклад, коли вам потрібно було перерахувати 7 рівномірно розташованих точок між 1 і 33. Тут розмір кроку може бути не дуже зрозумілим одразу. Однак у цьому випадку ви можете вручну визначити значення кроку.

Однак np.linspace() тут, щоб зробити це ще простішим для вас! 😄

Використовуйте простір linspace NumPy

Використовуючи np.linspace(), вам потрібно лише вказати кількість точок в інтервалі, не турбуючись про розмір кроку. І ви отримаєте назад масив за бажанням.

З такою мотивацією давайте перейдемо до вивчення синтаксису NumPy linspace() у наступному розділі.

Синтаксис NumPy linspace()

Синтаксис використання NumPy linspace() наведено нижче:

np.linspace(start, stop, num, endpoint, retstep, dtype, axis)

На початку наведений вище синтаксис може здатися дуже складним із багатьма параметрами.

Однак більшість із них є необов’язковими параметрами, і ми дійдемо до набагато простішого синтаксису лише за пару хвилин.

Тепер почнемо з аналізу наведеного вище синтаксису:

  • початок і зупинка — початкова і кінцева точки інтервалу відповідно. Початок і зупинка можуть бути скалярами або масивами. У цьому посібнику ми обмежимося скалярними початковими та кінцевими значеннями.
  • num — кількість рівномірно розташованих точок. І це необов’язковий параметр із значенням за замовчуванням 50.
  • кінцева точка також є необов’язковим параметром, який може мати значення True або False.
  • Значенням за замовчуванням є True, що означає, що кінцева точка буде включена в інтервал за замовчуванням. Однак ви можете встановити значення False, щоб виключити кінцеву точку.
  • retstep — ще один необов’язковий параметр, який приймає логічні значення True або False. Якщо встановлено значення True, повертається значення кроку.
  • dtype — тип даних чисел у масиві. Тип зазвичай виводиться як float, і його не потрібно надавати явно.
  • axis — ще один необов’язковий параметр, що вказує на вісь, уздовж якої мають зберігатися числа. І це актуально лише тоді, коли початкові та кінцеві значення самі є масивами.
  VirusTotal випускає додаток для Mac; Перевіряє файли на віруси, не відкриваючи їх

▶️ Отже, що повертає np.linspace()?

Він повертає N-вимірний масив рівномірно розташованих чисел. І якщо параметр retstep має значення True, він також повертає розмір кроку.

Виходячи з обговорення до цього моменту, ось спрощений синтаксис використання np.linspace():

np.linspace(start, stop, num)

Наведений вище рядок коду поверне масив num рівномірно розташованих чисел в інтервалі [start, stop].

Тепер, коли ви знаєте синтаксис, давайте почнемо кодувати приклади.

Як створити рівномірно розташовані масиви за допомогою NumPy linspace()

#1. Як наш перший приклад, давайте створимо масив з 20 рівномірно розташованих чисел в інтервалі [1, 5].

Ви можете вказати значення start, stop і num як ключові аргументи. Це показано в клітинці коду нижче:

import numpy as np
arr1 = np.linspace(start = 1,stop = 5,num = 20)
print(arr1)

# Output:
[1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
 2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
 3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
 4.78947368 5.        ]

Зверніть увагу, що числа в масиві починаються з 1 і закінчуються на 5, включаючи обидві кінцеві точки. Також зверніть увагу на те, як числа, включаючи точки 1 і 5, представлені як float у поверненому масиві.

#2. У попередньому прикладі ви передали значення для start, stop і num як аргументи ключового слова. Якщо ви передаєте аргументи в правильному порядку, ви можете використовувати їх як позиційні аргументи лише зі значеннями, як показано нижче.

import numpy as np
arr2 = np.linspace(1,5,20)
print(arr2)

# Output:
[1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
 2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
 3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
 4.78947368 5.        ]

#3. Тепер давайте створимо ще один масив, де ми встановимо для параметра retstep значення True.

Це означає, що тепер функція повертатиме і масив, і крок. І ми можемо розпакувати їх у дві змінні arr3: масив і step_size: повернутий розмір кроку.

У наступній клітинці коду пояснюється, як це можна зробити.

import numpy as np
arr3, step_size = np.linspace(1,5,20,retstep = True)
print(arr3)

# Output:
[1.         1.21052632 1.42105263 1.63157895 1.84210526 2.05263158
 2.26315789 2.47368421 2.68421053 2.89473684 3.10526316 3.31578947
 3.52631579 3.73684211 3.94736842 4.15789474 4.36842105 4.57894737
 4.78947368 5.        ]

# Output:
print(step_size)
0.21052631578947367

#4. Як останній приклад, давайте встановимо для кінцевої точки значення False і перевіримо, що відбувається.

import numpy as np
arr4 = np.linspace(1,5,20,endpoint = False)
print(arr4)

# Output:
[1.  1.2 1.4 1.6 1.8 2.  2.2 2.4 2.6 2.8 3.  3.2 3.4 3.6 3.8 
4.  4.2 4.4 4.6 4.8]

У поверненому масиві ви можете побачити, що 1 включено, тоді як 5 не включено. І останнє значення в масиві дорівнює 4,8, але ми все ще маємо 20 чисел.

  Врятуйте себе в мультиплатформері Beyond Gravity [Paid]

Поки що ми генерували лише масиви рівномірно розташованих чисел. У наступному розділі візуалізуємо ці числа.

Як побудувати рівномірні числа в інтервалі

У цьому розділі давайте виберемо [10,15] як інтервал інтересу. Потім скористайтеся np.linspace(), щоб створити два масиви, кожен з яких має 8 і 12 точок відповідно.

Після цього ми можемо використати функцію побудови з бібліотеки matplotlib, щоб побудувати їх.

Для ясності ми затиснемо два масиви з N1 = 8 і N2 = 12 рівномірно розташованих точок у різних положеннях уздовж осі y.

Наведений нижче фрагмент коду демонструє це.

import numpy as np
import matplotlib.pyplot as plt

N1 = 8
N2 = 12

a = 10
b = 15

y1 = np.zeros(N1)
y2 = np.zeros(N2)

x1 = np.linspace(a, b, N1)
x2 = np.linspace(a, b, N2)

plt.plot(x1, y1-0.5, 'o')
plt.plot(x2, y2 + 0.5, 'o')

plt.ylim([-1, 1])

plt.title(f'Evenly Spaced Numbers in the Interval [{a},{b}]')
plt.xlabel('Interval')

plt.show()

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

Як використовувати NumPy linspace() з математичними функціями

Після того як ви згенерували масив рівномірно розташованих чисел за допомогою np.linspace(), ви можете обчислити значення математичних функцій в інтервалі.

У комірці коду нижче ви спочатку генеруєте 50 рівномірно розташованих точок в інтервалі від 0 до 2π. Потім створіть масив y за допомогою np.sin() для масиву x. Зауважте, що ви можете пропустити параметр num, оскільки значення за замовчуванням дорівнює 50. Ми все одно будемо використовувати його явно.

Як наступний крок, ви можете побудувати графік функції синуса в інтервалі [0, 2π]. Для цього можна використовувати matplotlib, як у попередньому прикладі. Зокрема, функція plot() у matplotlib.pytplot використовується для створення лінійної діаграми.

import numpy as np
import matplotlib.pyplot as plt

N = 50

a = 0.0
b = 2*np.pi

x = np.linspace(a, b, N)
y = np.sin(x)

plt.plot(x, y, marker = "o")

plt.ylim([-1, 1])
plt.title(f'y = sin(x)')
plt.xlabel('x ---->')

plt.show()

Тепер запустіть наведений вище код, встановивши N рівним 10. Ви отримаєте графік, як показано на малюнку нижче.

І ви бачите, що графік не дуже гладкий, оскільки ви вибрали лише 10 точок у інтервалі.

Загалом, чим більшу кількість точок ви розглядаєте, тим гладкішим буде графік функції.

Висновок

Ось підсумок того, що ми дізналися.

  • np.linspace(start, stop, num) повертає масив num рівномірно розташованих чисел в інтервалі [start, stop].
  • Встановіть необов’язковий параметр кінцевої точки на False, щоб виключити зупинку, і встановіть інтервал на[початокзупинка)[startstop)
  • Встановіть для параметра retstep значення True, щоб отримати розмір кроку.
  • Створюйте рівномірно розташовані масиви за допомогою np.linspace(), а потім використовуйте масив із математичними функціями.

Сподіваюся, тепер ви розумієте, як працює np.linspace(). Ви можете виконати наведені вище приклади в блокноті Jupyter. Ознайомтеся з нашим посібником щодо ноутбука Jupyter або іншими альтернативами Jupyter, які ви можете розглянути.

До скорої зустрічі в іншому підручнику з Python. А поки продовжуйте кодувати!😀