Неверные результаты при применении операций к матрице - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь сделать изображение круга путем преобразования numpy matrix в изображение, но я получаю странные пропущенные строки на изображении, когда ввод 50 или больше. Как я могу это исправить?

Вход определяет размер матрицы, вход 50 составляет матрицу 50 by 50. Я начинающий программист, и я впервые задаю вопрос о переполнении стека, поэтому, пожалуйста, не беспокойтесь sh :) Это мой код.

from PIL import Image
import itertools
np.set_printoptions(threshold=np.inf)
inp = int(input("Input size of matrix"))
dt = np.dtype(np.int8)
M = np.zeros((inp, inp), dtype=dt)
A = (list(itertools.product(range(0, inp), repeat=2)))
count1 = 0
for n in A:
    x = (int(n[0]) / (inp - 1)) * 2
    y = (int(n[1]) / (inp - 1)) * 2
    if (x ** 2) + (y ** 2) - (2 * x) - (2 * y) <= -1:
        M[int(x * (inp - 1)/2), int(y * (inp - 1)/2)] = 1
        count1 += 1
print(M)
im = Image.fromarray(M * 255)
im.show()
print("Approximation of pi: " + str(4 * (count1 / inp ** 2))) ```

1 Ответ

0 голосов
/ 08 февраля 2020

Проблема в этой строке: M[int(x * (inp - 1)/2), int(y * (inp - 1)/2)] = 1 На самом деле, эта строка присваивает 1 дважды в некоторых индексах и пропускает некоторые индексы, потому что вы используете int(). Используйте round(), чтобы получить ближайшее целое число. Это поможет Измените эту строку: M[int(x * (inp - 1)/2), int(y * (inp - 1)/2)] = 1 на эту строку: M[round(x * (inp - 1)/2), round(y * (inp - 1)/2)] = 1

Ваш код должен выглядеть следующим образом:

from PIL import Image
import itertools
np.set_printoptions(threshold=np.inf)
inp = int(input("Input size of matrix"))
dt = np.dtype(np.int8)
M = np.zeros((inp, inp), dtype=dt)
A = (list(itertools.product(range(0, inp), repeat=2)))
count1 = 0
for n in A:
    x = (int(n[0]) / (inp - 1)) * 2
    y = (int(n[1]) / (inp - 1)) * 2
    if (x ** 2) + (y ** 2) - (2 * x) - (2 * y) <= -1:
        M[round(x * (inp - 1)/2), round(y * (inp - 1)/2)] = 1
        count1 += 1
print(M)
im = Image.fromarray(M * 255)
im.show()
print("Approximation of pi: " + str(4 * (count1 / inp ** 2)))

Я думаю, что это другое решение, которое также имеет ожидаемый результат, и оно простое решение без преобразования числа с плавающей точкой в ​​целое число (для индексов):

import itertools
import numpy as np
np.set_printoptions(threshold=np.inf)
inp = int(input("Input size of matrix"))
dt = np.dtype(np.int8)
M = np.zeros((inp, inp), dtype=dt)
A = (list(itertools.product(range(0, inp), repeat=2)))
# assign the center
cx,cy=int(inp/2), int(inp/2)
# assign the radius
rad=int(inp/2)
count1 = 0
for n in A:
    # calculate distance of a point from the center
    dist = np.sqrt((n[0]-cx)**2+(n[1]-cy)**2)
    # Assign 1 where dist < rad.
    if dist < rad:
        M[n[0], n[1]] = 1
        count1 += 1

print(M)
im = Image.fromarray(M * 255)
im.show()
print("Approximation of pi: " + str(4 * (count1 / inp ** 2)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...