Краткий ответ: Поскольку вы проверяете с помощью isinstance()
, вы можете использовать numpy.asanyarray()
, который будет проходить через любой ndarray и его подклассы без накладных расходов.
В соответствии с документами для numpy.asarray () , когда входные данные уже имеют тип ndarray
, нет накладных расходов, когда входные данные уже являются массивом: копирование не происходит, они "проходят" через". Хотя стоит отметить, что подкласс ndarray
не проходит.
Поскольку в исходном коде вы используете isisntance(x, ndarray)
, вам, скорее всего, понадобится numpy.asanyarray()
, который также проходит через подклассы ndarray
, что было бы более эффективно для вашего варианта использования. , (Потому что isinstance()
также возвращает true для подклассов)
Возвращает: out: ndarray Массив интерпретации a. Нет копии
выполняется, если вход уже является ndarray с соответствующим dtype и
порядок. Если a является подклассом ndarray, базовый класс ndarray имеет вид
вернулся.
Этот пример из документации (плюс мои собственные комментарии) объясняет различия и почему asanyarray()
лучше для вашего случая использования:
>>> issubclass(np.recarray, np.ndarray)
True # This is to show that recarray is a subclass of ndarray
>>> a = np.array([(1.0, 2), (3.0, 4)], dtype='f4,i4').view(np.recarray)
>>> np.asarray(a) is a
False # Here a copy happens which is an overhead you don't want,
# because the input type recarry is only a subclass of ndarray
>>> np.asanyarray(a) is a
True # Here no copying happens, your subclass of ndarray passes through.