Как проверить, является ли python объект numpy ndarray - PullRequest
2 голосов
/ 05 марта 2020

У меня есть функция, которая принимает массив в качестве входных данных и выполняет некоторые вычисления на нем. Входной массив может быть или не быть numpy ndarray (может быть списком, pandas объект и т. Д. c).

В функции я конвертирую входной массив (независимо от его типа) в numpy ndarray. Но этот шаг может быть вычислительно дорогим для больших массивов, особенно если функция вызывается несколько раз в a для l oop.

Следовательно, я хочу преобразовать входной массив в numpy ndarray ТОЛЬКО, если он еще не является numpy ndarray.

Как я могу это сделать?

import numpy as np

def myfunc(array):
    # Check if array is not already numpy ndarray
    # Not correct way, this is where I need help
    if type(array) != 'numpy.ndarray':
        array = np.array(array)

    # The computation on array
    # Do something with array
    new_array = other_func(array)
    return new_array

Ответы [ 4 ]

3 голосов
/ 05 марта 2020

Вы довольно близки, но вам нужно вызвать спецификационный класс c, то есть numpy.ndarray (здесь вы просто сравниваете со строкой). Также для этого у вас есть встроенный isinstance, также посмотрите, является ли данный объект экземпляром другого:

def myfunc(array):
    # Check if array is not already numpy ndarray
    if not isinstance(array, np.ndarray):
        array = np.array(array)

    # The computation on array
    # Do something with array
    new_array = other_func(array)
    return new_array
2 голосов
/ 05 марта 2020

Проще использовать asarray:

def myfunc(arr):
    arr = np.asarray(arr)
    # The computation on array
    # Do something with array
    new_array = other_func(arr)
    return new_array

Если arr уже является массивом, asarray не делает копию, поэтому штраф за ее пропуск через asarray отсутствует. , Пусть numpy сделает за вас тестирование.

numpy функции часто пропускают свои входные данные через asarray (или вариант), просто убедитесь, что тип соответствует ожидаемому.

2 голосов
/ 05 марта 2020

Вы можете использовать isinstance здесь.

import numpy as np
a=np.array([1,2,...])
isinstance(a,np.ndarray)
#True

def myfunc(array):
    return array if isinstance(array,np.ndarray) else np.array(array)

Вы просто возвращаете array, если это уже np.ndarray, иначе вы конвертируете array в np.array.

1 голос
/ 05 марта 2020
import numpy as np

def myfunc(array):
    # Check if array is not already numpy ndarray
    # Not correct way, this is where I need help
    if bool(np.type(array)):
        array = np.array(array)

    else:
    print('Big array computationally expensive')
    array = np.array(array)

    # The computation on array
    # Do something with array
    new_array = other_func(array)
    return new_array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...