#python #numpy
Вопрос:
Я пытаюсь добавить значения по элементам массива numpy, но я не знаю форму, пока не будет добавлен первый элемент, поэтому я написал следующий рабочий код с if
инструкцией:
import numpy as np
class Layer:
def __init__(self):
self.delta_weights = np.array([])
def add_delta_weights(self, delta_weights):
if(self.delta_weights.size > 0):
self.delta_weights = self.delta_weights delta_weights
else:
self.delta_weights = delta_weights
Мне интересно, есть ли лучший способ написать приведенный выше код без if
оператора? Как я могу инициализировать self.delta_weights
, чтобы я мог просто написать:
def add_delta_weights(self, delta_weights):
self.delta_weights = self.delta_weights delta_weights
Комментарии:
1. Обычно в python мы начинаем с
x=None
if x is None:
теста и используем его2. @hpaulj о да, я виноват! Я меняю его на
None
, ноif
утверждение все еще существует.3.
setl.delta_weights = np.array([0])
представляет собой массив формы (1,) , который взаимодействует с любой другой формой.4. Это именно то, что я ищу, спасибо! где я могу найти документацию по этому вопросу? (не стесняйтесь оставлять свой комментарий в качестве ответа, чтобы я мог его принять)
5. @hpaulj есть причины не использовать
np.array(False)
или дажеFalse
вместо этого? Я думаю, что он делает в основном то же самое, что и ваше предложение, но оставляет скаляры в покое, а также сохраняет все (?) числовые типы dtypes. Версия массива (по сравнению с чистойFalse
) имеет то преимущество, что она может обрабатывать «массивоподобные» вещи, такие как списки, но недостаток в том, что она делает массивы 0d из скаляров.
Ответ №1:
В целом, иметь неинициализированное состояние-плохая практика. Для этого существуют конструкторы, и существование объекта должно подразумевать, что его состояние является действительным.
Вы можете использовать конструктор, чтобы сделать его чистым:
import numpy as np
class Layer:
def __init__(self, delta_weights: np.array):
self._delta_weights = delta_weights
def add_delta_weights(self, other: np.array):
self._delta_weights = other
Само существование а layer = Layer(weights)
подразумевает, что внутреннее состояние является действительным.
Использование:
layer = Layer(np.zeros((5, 6, 7))) # 1st call
layer.add_delta_weights((np.zeros((5, 6, 7)))) # consecutive calls
layer.add_delta_weights((np.zeros((5, 6, 7)))) # consecutive calls
layer.add_delta_weights((np.zeros((5, 6, 7)))) # consecutive calls
Я предполагаю, что ваша логика упаковки имеет некоторое значение «1-й вызов» и «последовательные вызовы».
В общем, старайтесь избегать утверждений if.