如何检查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