Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查python值是否是numpy数据类型的实例?_Python_Python 2.7_Numpy_Isinstance - Fatal编程技术网

如何检查python值是否是numpy数据类型的实例?

如何检查python值是否是numpy数据类型的实例?,python,python-2.7,numpy,isinstance,Python,Python 2.7,Numpy,Isinstance,如何检查给定值是否可以存储在numpy数组中 例如: 我想要一个函数np\u isinstance,它可以执行以下操作: np_isinstance("a", np.array(["a","b"]).dtype) ==> True np_isinstance(1, np.array(["a","b"]).dtype) ==> False np_isinstance("a", np.array([1,2,3]).dtype) ==> False np_isinstance(1,

如何检查给定值是否可以存储在
numpy
数组中

例如:

我想要一个函数
np\u isinstance
,它可以执行以下操作:

np_isinstance("a", np.array(["a","b"]).dtype)
==> True
np_isinstance(1, np.array(["a","b"]).dtype)
==> False
np_isinstance("a", np.array([1,2,3]).dtype)
==> False
np_isinstance(1, np.array([1,2,3]).dtype)
==> True
到目前为止,我设法想出了

def np_isinstance(o,dt):
    return np.issubdtype(np.array([o]).dtype, dt)
但这似乎是错误的,因为它在每次调用时分配一个
数组

人们可能希望这能起到作用,但是,唉

np.can_cast("a",np.dtype("O"))
> TypeError: did not understand one of the types; 'None' not accepted

如果我理解正确,整个numpy数组始终是某种类型的,并且数组中不能有混合项,我建议执行以下操作:

isinstance(my_array, np.ndarray)`
这就是我在单元测试中所做的:

assert-isinstance(组,np.ndarray)

而在我的生产代码中,我是这样做的

groups = [-1, -1, 0, 2]
groups = np.asarray(g, dtype=np.uint8)

编辑:一开始我误解了这个问题。您需要检查是否可以在数组中插入ceratin变量。那么让我们试试这个:

def is_var_allowed(x):
    try:
        x = np.uint8(x)
        return True
    except ValueError:
        return False

def main():
    my_arr = np.ones((5,), dtype=np.uint8))
    x = 7
    if is_var_allowed(x):
       my_arr.put(3, x)
这将产生一个数组
[1 1 7 1]
。我们可以通过给函数
is_var\u allowed
一个数据类型作为参数来概括这一点,如下所示:

def is_var_allowed(x, func):
    try:
        x = func(x)
        return True
    except ValueError:
        return False

def main():
    my_uint_arr = np.ones((5,), dtype=np.uint8))
    x = 7
    if is_var_allowed(x, np.uint8):
       my_uint8_arr.put(3, x)

    my_char_arr = np.char.array((5,1))
    y = "Hallo"
    if is_var_allowed(y, np.char)
        my_char_arr[:] = y

我不知道如何直接判断,因为有这么多,您可以使用以下功能进行判断:

def np_isinstance(value, np_data):
    """
    This function for 1D np_data
    """
    flag = False
    try:
        tmp = np_data[0] + value
        flag = True
    except:
        pass
    return flag

can_cast
复制您的测试用例:

In [213]: np.can_cast(type("a"), np.array(["a","b"]).dtype)
Out[213]: True
In [214]: np.can_cast(type(1), np.array(["a","b"]).dtype)
Out[214]: False
In [215]: np.can_cast(type("a"), np.array([1,2,3]).dtype)
Out[215]: False
In [217]: np.can_cast(type(1), np.array([1,2,3]).dtype)
Out[217]: True
In [219]: np.can_cast(type(1), np.dtype("O"))
Out[219]: True
In [220]: np.can_cast(type("a"), np.dtype("O"))
Out[220]: True

请注意,我正在将
类型
数据类型
匹配。哦,我想我误解了你的问题。您尝试检查是否可以将值放入数组中。那么,为什么不尝试从中创建另一个变量:np.uint8(my_var)。您可以使用try/except来保护它,看看它是否失败。如果没有,您可以将其放入数组中。np.uint8()在呈现stringStill no go时将失败。您假设的是数字数据类型。当使用a函数作为第二个参数时,您可以对其进行泛化。
func
在哪里可以获得
var\u
?我有一个
dtype
对象。如何将其“推广”到您的函数?最重要的是,你的版本比我的好吗?如果数组
np\u数据
为空怎么办?如果我没有数组,只有数据类型呢?这比我的版本好多少?是的,你是对的。我错过了这些,我将继续思考另一种方法。@sds,但对于您的答案,请检查o=1.1,“dt=np.int64”,“np_isinstance(o,dt)”,您是否希望浮点数不应插入到np.int64数组或int64数字不应插入到浮点数数组?每次分配一个数组都不是什么大问题。它可能比你想象的要便宜(或者更确切地说,其他东西可能比你想象的更贵,所以相对而言,分配是便宜的)。
In [213]: np.can_cast(type("a"), np.array(["a","b"]).dtype)
Out[213]: True
In [214]: np.can_cast(type(1), np.array(["a","b"]).dtype)
Out[214]: False
In [215]: np.can_cast(type("a"), np.array([1,2,3]).dtype)
Out[215]: False
In [217]: np.can_cast(type(1), np.array([1,2,3]).dtype)
Out[217]: True
In [219]: np.can_cast(type(1), np.dtype("O"))
Out[219]: True
In [220]: np.can_cast(type("a"), np.dtype("O"))
Out[220]: True