【问题标题】:How to check if a python object is a numpy ndarray如何检查python对象是否是numpy ndarray
【发布时间】:2020-06-18 10:21:06
【问题描述】:

我有一个函数,它接受一个数组作为输入并对其进行一些计算。输入数组可能是也可能不是 numpy ndarray(可能是列表、pandas 对象等)。

在函数中,我将输入数组(无论其类型如何)转换为 numpy ndarray。但是对于大型数组,此步骤的计算成本可能很高,尤其是在 for 循环中多次调用该函数时。

因此,只有当它还不是 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

【问题讨论】:

    标签: python arrays performance numpy types


    【解决方案1】:

    你已经很接近了,但你需要调用特定的类,即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】:

    您可以在此处使用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)
    

    如果 np.ndarray 已经是 array,则只需返回 array 即可将 array 转换为 np.array

    【讨论】:

      【解决方案3】:

      使用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(或变体)传递它们的输入,只要确保类型是它们所期望的。

      【讨论】:

        【解决方案4】:
        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
        

        【讨论】:

          猜你喜欢
          • 2015-08-24
          • 2020-12-23
          • 1970-01-01
          • 2017-11-14
          • 2023-03-22
          • 1970-01-01
          • 2020-03-23
          • 2014-04-23
          相关资源
          最近更新 更多