Всем доброго времени суток, представляю вашему вниманию подборку задач NumPy 31-60, благодаря которым значительно увеличится эффективность работы с данной библиотекой. Во многих задачах используются разные варианты решения. Задачи с решениями можно посмотреть в GitHub, ссылка ниже.
# 31. Заменить максимальный элемент на 0
# -----------Вариант 1.-----------
# Однако, если в массиве будут повторяющиеся минимальные или максимальные элементы,
# то присваивание 0 производиться не будет
print('вариант 1')
m = np.random.random([5,5])
m.flatten()[m.argmax()] = 0
print(m)
print()
# -----------Вариант 2.-----------
# при повторяющихся минимальных элементах замена будет производиться везде (корректный вариант)
print('вариант 2')
m = np.random.randint(low=1, high=10, size=[5,5])
m[np.where(m == m.min())] = 0
print(m)
print()
# 32. Создать структурированный массив с координатами x, y на сетке в квадрате [0,1]x[0,1]
m = np.zeros([10,10], [('x', float), ('y', float)])
m['x'], m['y'] = np.meshgrid(np.linspace(0,1,10), np.linspace(0,1,10))
# 33. Из двух массивов создать матрицу Коши C (Cij = 1/(xi-yj))
a = np.arange(8)
b = a + 0.5
c = 1 / np.subtract.outer(a,b)
print(np.linalg.det(c))
# 34. Найти минимальное и максимальное значение, принимаемое каждым числовым типом numpy
for dtype in [np.int8, np.int32, np.int64]:
print(np.iinfo(dtype).min)
print(np.iinfo(dtype).max)
for dtype in [np.float32, np.float64]:
print(np.finfo(dtype).min)
print(np.finfo(dtype).max)
print(np.finfo(dtype).eps)
# 35. Напечатать все значения в массиве
np.set_printoptions(threshold=np.nan)
m = np.zeros((5, 5))
print(m)
# 36. Найти ближайшее к заданному значению число в заданном массиве
v = np.random.randint(low=1, high=100, size=[5,5])
print(v)
# к данному числу нужно найти ближайшее число в массиве
approx = 21
# -----------Вариант 1.-----------
# (если несколько минимальных элементов, возьмет только один)
print('\nвариант 1')
index = (np.abs(v-approx).argmin())
print(v.flat[index])
# -----------Вариант 2.-----------
# (учитывает несколько вариантов ближайших чисел)
def find_nearest(a, aim):
""" функция находит индексы минимальных чисел к числу 'aim' """
v = np.abs(a - aim)
idx = np.where(v == v.min())
return idx
# может быть так, что несколько чисел окажутся ближайшими к числу
# напрмер к числу 10 ближайшие 9 и 11
print('\nвариант 2')
a = find_nearest(v, approx)
print('ближайшее(-ие) к числу approx')
print(np.unique(v[a]))
# 37. Создать структурированный массив, представляющий координату (x,y) и цвет (r,g,b)
Z = np.zeros(10, [ ('position', [('x', float, 1),
('y', float, 1)]),
('color', [('r', float, 1),
('g', float, 1),
('b', float, 1)])])
print(Z)
# 38. Дан массив (5,2) координат, найти расстояние от каждой до каждой точки
from scipy.spatial import distance_matrix, distance
m = np.random.randint(low=0, high=100, size=[5,2])
print('массив:')
print(m)
print()
print('вариант 1')
dst = distance_matrix(m, m)
print(dst)
print()
print('вариант 2')
dst2 = distance.cdist(m,m)
print(dst2)
# 39. Преобразовать массив из int в float
# создание массива целочисленных значений
m = np.random.randint(low=1, high=100, size=[5,5])
# преобразование в float
m = m.astype('f', copy=False)
print(m)
# 40. Файл лежит в папке "file/40/file.txt", как прочитать файл?
v = np.genfromtxt('files/40/file.txt', delimiter=',')
print(v)
# 41. Каков эквивалент функции enumerate для numpy массивов?
a = np.array([[1, 2], [3, 4]])
for index, x in np.ndenumerate(a):
print(index, x)
# 42. Сформировать матрицу по Гауссу
from scipy.stats import norm
x = np.linspace(-3,3,1000)
y = norm.pdf(x, loc=0, scale=1)
# формируем матрицу по Гауссу
m = np.column_stack((x,y))
plt.plot(m[:,0],m[:,1]);
plt.title('Распределение по Гауссу');
plt.show()
# -----------дополнительно.-----------
# формируем случайную матрицу, близкую к нормальному распределению
m = np.random.randn(1000)
sns.set()
plt.title('Распределение по Гауссу');
plt.hist(m,20,color='grey');
plt.show()
# 43. Случайно расположить (заменить) p элементов в 2D массив
# кол-во заменяемых элементов
p = 5
# -----------Вариант 1.-----------
print('------вариант 1------')
m = np.random.randint(low=1, high=100, size=[5,5])
print('\nмассив:')
print(m)
print('\nс заменой')
np.put(m, np.random.choice(range(m.size), p, replace=False), 0)
print(m)
print()
# -----------Вариант 2.-----------
print('------вариант 2------')
m2 = np.random.randint(low=1, high=100, size=[5,5])
print('\nмассив:')
print(m2)
# m.size ---> вычисляет кол-во элементов в массиве (аналог numel в MATLAB)
# np.random.permutation ---> создает вектор в случайном порядке
idx = np.random.permutation(m2.size)[:np.abs(p)]
print('\nслучайные элементы:')
print(idx)
print('\nмассив с заменой случайных элементов')
m2.flat[idx] = 0
print(m2)
# 44. Отнять среднее из каждой строки в матрице
m = np.random.randint(low=1, high=100, size=[3,3])
print('массив:')
print(m)
print()
print('средние значения каждой строки матрицы')
print(m.mean(axis=1))
# keepdims ---> сохранить размерность исходного массива
print()
print('вычитание из матрицы средних значений')
m = m - m.mean(axis=1, keepdims=True)
print(m)
# 45. Отсортировать матрицу по n-ому столбцу
n = 2
m = np.random.randint(low=1, high=100, size=[5,5])
print('массив:')
print(m)
print()
print('сортированный массив по n-ому столбцу')
print(m[m[:,n].argsort()])
print()
# 46. Определить, есть ли в 2D массиве нулевые столбцы
m = np.random.randint(low=0, high=2, size=[2,10])
# -----------Вариант 1.-----------
# (возвращает булево значение)
print('\n------вариант 1------')
print()
print(m)
print()
print((~m.any(axis=0)).any())
# -----------Вариант 2.-----------
# (возвращает индексы колонок, решение через сумму)
print('\n------вариант 2------')
print()
null_columns = np.where(np.sum(a=m, axis=0) == 0)
if null_columns[0].size > 0:
print('Имеются нулевые столбцы:', null_columns[0])
else:
print('Нулевых столбцов нет')
print()
print(m)
# 47. Дан массив, добавить 1 к каждому элементу с индексом, заданным в другом массиве
# осторожно с повторами (их необходимо суммировать)
# функция bincount ---> мощная вещь (считает кол-во вхождений в массив)
# нужна корректная работа как с одномерными так и с многомерными массивами
# если в матрице 'a' имеются повторы, то необходимо эти повторы суммировать
b = np.ones([5,5])
sh = b.shape
b = b.flatten()
a = np.random.randint(low=0, high=b.size, size=20)
b += np.bincount(a, minlength=b.size)
b = b.reshape(sh)
print(b)
# 47.1 Дан массив, добавить 1 к каждому элементу с индексом, заданным в другом массиве
# осторожно с повторами (суммировать не нужно)
b = np.ones([5, 5])
a = np.random.randint(low=0, high=b.size, size=[10])
b.flat[a] += 1
print(b)
# 48. Дан массив (w,h,3) (картинка) dtype=ubyte, посчитать количество различных цветов
w,h = 16,16
I = np.random.randint(0, 2, (h,w,3)).astype(np.ubyte)
F = I[...,0] * 256 * 256 + I[...,1] * 256 + I[...,2]
n = len(np.unique(F))
print(np.unique(I))
# 49. Дан четырехмерный массив, посчитать сумму по последним двум осям
A = np.random.randint(0,10, (3,4,3,4))
sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)
print(sum)
# 50. Найти диагональные элементы произведения матриц
a = np.array([[1,2], [3,4]])
b = np.array([[5,6], [7,8]])
# -----------Вариант 1.-----------
# (медленный вариант)
print('вариант 1')
print(np.diag(np.dot(a, b)))
print()
print(np.dot(a,b))
# -----------Вариант 2.-----------
# (быстрый вариант)
print('вариант 2')
print(np.sum(a*b.T, axis=1))
# 51. Дан вектор [1, 2, 3, 4, 5], построить новый вектор с тремя нулями между каждым значением
v = np.arange(start=1, stop=6)
every = 3
v2 = np.zeros(len(v) + (len(v)-1)*(every))
v2[::every+1] = v
print(v2)
# 52. Поменять две случайные строки в матрице
# формирование матрицы
m = np.arange(25).reshape(5,5)
print(m)
# случайно отбираем две строки в матрице
r = np.random.choice(range(m.shape[0]), 2, replace=False)
# присвоение переменным
r1, r2 = r[0], r[1]
print()
print('случайно выбранные строки:' + str(r1) + ',' + str(r2))
print()
m[[r1,r2]] = m[[r2,r1]]
print(m)
# 53. Вычислить имеются ли в массиве какие-либо значения превышающие 13?
m = np.random.randint(low=1, high=15, size=[3,3])
print(m)
print()
print(np.any(m > 13))
# 54. Сортировать массив по строкам и стобцам
rand = np.random.RandomState(42)
m = rand.randint(0, 10, [4,6])
# сортируем по столбцам
print('сортировка по столбцам')
m1 = np.sort(m, axis=0)
print(m1)
# сортируем по строкам
print('сортировка по строкам')
m2 = np.sort(m, axis=1)
print(m2)
# 55. Создать структурированный массив
s = np.dtype({'names': ('name', 'age', 'weight'),
'formats': ('U10', 'i4', 'f8')})
print(s)
# 56. Вычислить ранг матрицы
m = np.random.randint(low=1, high=100, size=[3,3])
rank = np.linalg.matrix_rank(m)
print(rank)
# 57. Найти n наибольших уникальных значений в массиве
n = 3
m = np.random.randint(low=1, high=10, size=[2,3])
print(m)
# тяжелый варант (стоит найти легче)
print()
print('n наибольших значений в массиве')
print(np.unique((np.sort(m.flat)))[::-1][:n])
# 58. Узнать размерность матрицы
m = np.random.randint(low=1, high=10, size=[3,5])
print(m.shape)
# 59. Написать алгоритм поиска ближайших соседей
rand = np.random.RandomState(6)
K=2
r = rand.rand(5,2)
# вычислений матрицы дистанций
dist_sq = np.sum((r[:, np.newaxis,:] - r[np.newaxis,:,:])**2, axis=-1)
# выводим ближайших соседей
nearest = np.argpartition(dist_sq, K+1, axis=1)
# визуализация
plt.scatter(r[:,0], r[:,1], s=50)
for i in range(r.shape[0]):
for j in nearest[i, :K+1]:
# отображение линий от r[i] до r[j]
plt.plot(*zip(r[j], r[i]), color='r')
print(nearest)
# 60. Написать алгоритм игры "жизнь"
def iterate(m):
# кол-во соседей
N = (m[0:-2,0:-2] + m[0:-2,1:-1] + m[0:-2,2:] +
m[1:-1,0:-2] + m[1:-1,2:] +
m[2: ,0:-2] + m[2: ,1:-1] + m[2: ,2:])
# правила
birth = (N == 3) & (m[1:-1,1:-1]==0)
survive = ((N == 2) | (N == 3)) & (m[1:-1,1:-1] == 1)
m[...] = 0
m[1:-1,1:-1][birth | survive] = 1
return m
m = np.random.randint(0,2,(10,10))
for i in range(10):
m = iterate(m)
# print(m)
Исходники доступы на GitHub
Я к вам по вот какому делу! Хочу предложить всем заинтересованным посетить интернет-магазин чемоданов boxvoyage.ru, там вы всегда найдете хорошие <a href=https://boxvoyage.ru/detskie-chemodany/>купить детские чемоданы на колесиках</a> и не только. Причем с быстрой доставкой по Москве
# 1
Отправитель: Waltervuh
Дата: 27 Январь 2023 в 08:51