s1lver0k
@s1lver0k
std

Python. Как написать функцию для заполнения матрицы по условию?

Само условие для заполнения:
Cij = 22/(i+j)
i - строка
j - столбец
  • Вопрос задан
  • 2078 просмотров
Решения вопроса 1
@nirvimel
Первое правило numpy - НИКАКИХ ЦИКЛОВ!
from time import time
import numpy
from numpy.lib.stride_tricks import as_strided

def fill_matrix_python(width, height):
    i, j = numpy.mgrid[0:height, 0:width]
    return 22. / (i + j + 2)

def fill_matrix_native(width, height):
    array = numpy.arange(2, width + height + 2)
    stride = array.strides[0]
    view_2d = as_strided(array,
                         shape=(width, height),
                         strides=(stride, stride))
    return 22. / view_2d

start_time = time()
fill_matrix_python(10000, 10000)
print('Python implementation: Matrix 10000x10000 filled in %.3f seconds' % (time() - start_time))

start_time = time()
fill_matrix_native(10000, 10000)
print('Native implementation: Matrix 10000x10000 filled in %.3f seconds' % (time() - start_time))


Python implementation: Matrix 10000x10000 filled in 3.332 seconds
Native implementation: Matrix 10000x10000 filled in 0.532 seconds

Более красивое решение через mgrid под капотом реализовано все-таки через циклы на скрипте (благодарю SkiBY за замечание).
Менее красивое решение через манипуляцию со страйдами реализовано полностью нативно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Astrohas
@Astrohas
Python/Django Developer
def fill(c, width, height):
    for i in range(height):
        for j in range(width):
            c[i][j] = round(22/(i+j+2), 1)
    return c


a = [[0]*5 for _ in range(5)]
for i in fill(a, 5, 5):
    print(i)
Ответ написан
Комментировать
@gill-sama
без numpy как то так
def create_matrix(h, w):
	a = []
	for i in range(h):
		a.append([])
		for j in range(w):
			a[i].append(22/(i+j+2))
	return a
Ответ написан
Комментировать
@SkiBY
def fill(width, height):
    if width==0 or height == 0:
        return u'Матрица фуфуфу'
    c=[]
    for i in range(height-1):
        c.append([])
        for j in range(width-1):
            c[i].append(22/(i+j+2))
    return c
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
24 апр. 2024, в 22:11
2000 руб./за проект
24 апр. 2024, в 22:00
500 руб./в час
24 апр. 2024, в 21:49
10000 руб./за проект