добавьте массивы numpy, не зная формы

#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.