Разделение 2D-массива и замена значений в Python - PullRequest
1 голос
/ 07 апреля 2020

У меня есть 2D-массив, и его размер основан на переменной. Я хотел бы изменить значения указанных c строк и столбцов на основе уравнения.

Например:

import numpy as np

size = 6
weight = np.ones([size, size])
weight[size / 6 * 2:size / 6 * 4 + 1, :] = 5

print(weight)

Но я получил ошибку:

TypeError: slice indices must be integers or None or have an __index__ method

Я думаю size / 6 * 2 и size / 6 * 4 - целые числа.

Как это исправить?

И если мне нужно установить size / 6 равным float, например, 7 / 6, как я могу написать код, чтобы сделать 7 / 6 в ближайшее целое число, чтобы избежать ошибки, показанной выше?

1 Ответ

1 голос
/ 07 апреля 2020

Python изначально поддерживает два типа деления. Разделение по этажам выполняется с // и всегда приводит к int. Истинное деление выполняется с / и всегда приводит к float.

. Вы можете проверить следующее:

>>> size = 6
>>> type(size / 6)
float
>>> type(size // 6)
int
>>> size / 6 == size // 6
True

Таким образом, самый простой способ - написать:

weight[size // 6 * 2:size // 6 * 4 + 1, :] = 5

Кроме того, вы можете сделать приведение явным, хотя это менее эффективно:

weight[int(size / 6) * 2:int(size / 6) * 4 + 1, :] = 5

Кстати, если вы хотите разделить потолок, просто добавьте (6 - 1) = 5 и выполните деление по полу:

weight[(size + 5) // 6 * 2:(size + 5) // 6 * 4 + 1, :] = 5

Если вы хотите округлить, добавьте 6 / 2 = 3.0 и сделайте деление по полу:

weight[(size + 3) // 6 * 2:(size + 3) // 6 * 4 + 1, :] = 5

И, конечно, вы можете округлить явно:

weight[round(size / 6 * 2):round(size / 6 * 4) + 1, :] = 5

Все эти параметры будут работать для значений size, которые не являются целыми числами, кратными 6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...