120 задач NumPy. Часть 1

120 задач, благодаря которым вы повысите свою эффективность by Grossmend (Февраль 10, 2019 в 11:12)

Всем доброго времени суток, представляю вашему вниманию подборку задач NumPy 1-30, благодаря которым значительно увеличится эффективность работы с данной библиотекой. Во многих задачах используются разные варианты решения. Задачи с решениями можно посмотреть в GitHub, ссылка ниже.

# Импортируем модули
import matplotlib.pyplot as plt
import seaborn as sns
# 1. Импортировать NumPy
import numpy as np
# 2. Напечатать версию и конфигурацию
print(np.__version__)
# 3. Создать вектор (одномерный массив) размера 10, заполненый нулями
np.zeros([10])
# 4. Создать вектор размер 10, заполненный единицами
np.ones([10])
# 5. Создать вектор размера 10, заполненный числом 2.5
np.full([10], 2.5)
# 6. Получить документацию о функции numpy.add из командной строки
help (np.add)
# 7. Создать вектор заполненный нулями, но пятый элемент равен 1
v = np.zeros([10])
v[4] = 1
v
# 8. Создать вектор со значениями от 10 до 49
v = np.arange(start=10, stop=50)
v
# 9. Развернуть вектор (первый становится последним)
v = np.arange(start=1, stop=11)
print('вариант 1')
v1 = v[::-1]
print(v1)

print()
print('вариант 2')
v2 = np.flip(v, 0)
print(v2)
# 10. Создать матрицу (двумерный массив) 3x3 со значениями от 0 до 8
m = np.arange(0,9).reshape(3,3)
np.reshape
m
# 11. Найти индексы ненулевых элементов в [1,2,0,0,4,0]

# -----------вариант 1.-----------
print('вариант 1')
print(np.nonzero([1,2,0,0,4,0]))
print()

# -----------вариант 2.-----------
print('вариант 2')
v = np.array([1,2,0,0,4,0])
print(np.where(v != 0))
# 12. Создать единичную матрицу 3x3
np.eye(3)
# 13. Создать массив 3x3x3 со случайными значениями
np.random.random([3,3,3])
# 14. Создать массив 10x10 со случайными значениями, найти минимум и максимум
m = np.random.random([10,10])

# -----------вариант 1.-----------
max_var1, max_var2 = m.min(), m.max()
print('варинат 1')
print(max_var1, max_var2)
print()

# -----------вариант 2.-----------
print('вариант 2')
min_var2 = np.min(m)
max_var2 = np.max(m)
print(min_var2)
print(max_var2)
# 15. Создать случайный вектор размера 30 и найти среднее значение всех элементов
v = np.random.random([30])
v.mean()
# 16. Создать матрицу с 0 внутри и 1 на границах

# -----------вариант 1.-----------
m = np.ones([10,10])
m[1:-1, 1:-1] = 0
m
# 17. Выяснить результат следующих выражений
print(0 * np.nan)
print(np.nan == np.nan)
print(np.inf > np.nan)
print(np.nan - np.nan)
print(0.3 == 3 * 0.1)
# 18. Создать 5x5 матрицу с 1,2,3,4 под диагональю

# -----------Вариант 1.-----------
# Решение в интернете, но я хотел чтобы было добавление с двух сторон k-+1
# и была возможность добавления на существующую матрицу

m = np.diag(np.arange(1, 5), k=-1)

print()
print('Вариант 1')
print(m)

# -----------Вариант 2.-----------
# Тяжелый и неправильный вариант. Созданы 4 лишних переменные.

# m = np.arange(1, 26).reshape([5,5])
m = np.zeros([5,5], dtype='i')

# создаем доп. матрицы с нужными диагоналями
d1 = np.diag(np.arange(1, m.shape[0]), k=-1)
d2 = np.diag(np.arange(1, m.shape[0]), k=1)

# получаем индексы, которые удовлетворяют условию
ind1 = np.where(d1>0)
ind2 = np.where(d2>0)

# присвоение значений по индексам
diag_vec = np.arange(start=1, stop=5, dtype='i')
m[ind1] = diag_vec
m[ind2] = diag_vec

print()
print('Вариант 2')
print(m)

# -----------Вариант 3.-----------
# Легкий варинат без создания дополнительной матрицы

# определим функцию, которая возвращает индексы в зависимсоти от смещения (k) матрицы (m)

def diag_indices_k(m, k):
    
    """ функция возвращает индексы диагональных элементов матрицы (m) со смещением (k) """
    
    rows, cols = np.diag_indices_from(m)
    if k < 0:
        return rows[-k:], cols[:k]
    elif k > 0:
        return rows[:-k], cols[k:]
    else:
        return rows, cols

# создаем матрицу (m)

# m = np.arange(1, 26).reshape([5,5])
m = np.zeros([5,5], dtype='i')

# проставляем со смещением диагональные значения
diag_vec = np.arange(start=1, stop=5, dtype='i')
m[diag_indices_k(m, -1)] = diag_vec
m[diag_indices_k(m, 1)] = diag_vec

print()
print('Вариант 3')
print(m)
# 19. Создать матрицу 8x8 и заполнить ее в шахматном порядке
m = np.zeros([8,8])
m[::2, ::2] = 1
m[1::2, 1::2] = 1
m
# 20. Дан массив размерности (6,7,8). Каков индекс (x,y,z) сотого элемента?
print(np.unravel_index(100, (6,7,8)))
# 21. Создать матрицу 8x8 и заполнить ее в шахматном порядке, используя функцию tile

# -----------Вариант 1.-----------
m1 = np.tile(A=np.array([[1,0], [0,1]]), reps=[4,4])
print('вариант 1')
print(m1)
print()
# -----------Вариант 2 (первое что пришло в голову).-----------

# тяжелый вариант
begin = np.array([0,1])
m2 = np.tile(begin, [8,5])

# m2 = np.arange(start=1, stop=65).reshape(8,8)
# print(m)

m2[::2,0:-1] = m2[::2,1:]
m2 = m2[:,:-2]

print()
print('вариант 2')
print(m2)

# проверка на равенство двух матриц
print()
print(np.array_equal(m1, m2))
# 22. Перемножить матрицы 5x3 и 3x2

a = np.random.random([5,3])
b = np.random.random([3,2])
print(np.dot(a,b))
# 22.1. Создать случайную матрицу 5x7 целых чисел от 1 до 100 и удалить [3,5] колонки

m = np.random.randint(low=1, high=100, size=[5,7])
print(m)
print()
d = [3,5]
m = np.delete(arr=m, obj=d, axis=1)
print(m)
# 23. Дан массив, поменять знак у элементов, значения которых между 3 и 8

# -----------Вариант 1.-----------
m = np.random.randint(low=1, high=25, size=[5,5])
m[(m > 3) & (m < 8)] *=-1
print(m)
print()

# -----------Вариант 2.-----------
m = np.random.randint(low=1, high=25, size=[5,5])
ind = np.where((m > 3) & (m < 8))
m[ind] *=-1
print(m)
# 24. Создать матрицу 5x5 со значениями в строках от 0 до 4

# -----------Вариант 1.-----------
print('вариант 1')
m = np.zeros([5,5])
m += np.arange(5)
print(m)
print(m.dtype)
print()

# -----------Вариант 2.-----------
print('вариант 2')
m = np.tile(np.arange(5,dtype='float'),[5,1])
print(m)
print(m.dtype)
# 25. Есть генератор, сделать с его помощью массив

# -----------Вариант 1.-----------
# Однако, функция fromiter поддерживает только одномерные массивы (векторы)
def generate():
    for x in range(10):
            yield x
        
m = np.fromiter(generate(), dtype='float', count=-1)
print(m)

# -----------Вариант 2.-----------
# Сделаем, чтобы была возможность преобразовывать и многомерные массивы
# 25.1 Создать двумерный список и преобразовать его в NumPy массив (с типом int32)

list_arr = [[i for i in range(10)] for j in range(10)]
np_arr = np.array(list_arr, dtype='i')
print(np_arr)
print(np_arr.dtype)
# 26. Создать вектор размера 10 со значениями от 0 до 1, не включая ни то, ни другое

# -----------Вариант 1.-----------
print('вариант 1')
v = np.linspace(start=0, stop=1, num=12)[1:-1]
print(v)
print()
# -----------Вариант 2.-----------
print('вариант 2')
v = np.linspace(0,1,11, endpoint=False)
v = v[1:]
print(v)
# 27. Отсортировать вектор

v = np.random.random(size=[10])
print(v)
print()
v = np.sort(a=v, axis=0)
print(v)
# 28. Проверить, одинаковы ли 2 NumPy массива

a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4,5])
print('вариант 1')
print(np.array_equal(a,b))
print()
print('вариант 2')
print(np.allclose(a,b))
# 29. Сделать массив неизменяемым
m = np.zeros([5,5])
m.flags.writeable = False
m[0] = 1
# 30. Дан массив 10x2 (точки в декартовой системе координат),
# нужно преобразовать в полярную

m = np.random.random([10,2])
x,y = m[:,0], m[:,1]
r = np.hypot(x,y)
t = np.arctan2(y,x)
print(r)
print(t)
Исходники доступы на GitHub

обновлено: Март 6, 2019 в 10:43


Количество комментариев: 0

Комментариев нет



Добавить комментарий: