您有一个对象 dtype 数组。 numpy 数组在 dtype 为数字时是最好的——无论是速度还是操作范围。
除此之外,None、np.nan 的测试和数组的相等性测试也存在问题。
is None 是None 的最佳测试。 np.isnan 是对nan 的最佳测试,因为没有任何东西等于nan,甚至不等于它本身。并且对数组的相等性测试会产生布尔数组和ambiguity 错误。
In [58]: arr = np.array([[1, None, 3],
...: [4, 5, np.nan],
...: [7, 'eight', 9]])
In [59]: arr
Out[59]:
array([[1, None, 3],
[4, 5, nan],
[7, 'eight', 9]], dtype=object)
In [60]: arr == None
Out[60]:
array([[False, True, False],
[False, False, False],
[False, False, False]])
好的,None 测试可以,但nan 不行:
In [61]: arr == np.nan
Out[61]:
array([[False, False, False],
[False, False, False],
[False, False, False]])
In [62]: np.isnan(arr)
Traceback (most recent call last):
File "<ipython-input-62-25d2f1dae78d>", line 1, in <module>
np.isnan(arr)
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
isnan 适用于 float dtype 数组,而不是 object dtype。
使用数组元素创建数组会产生警告。那是因为从混合长度的数组中创建一个数组通常是一个错误。
In [63]: arr_elem = np.array([3,3,3])
...: arr1 = np.array([[1, None, arr_elem],
...: [4, 5, np.nan],
...: [7, 'eight', 9]])
<ipython-input-63-6d36e87ab1a9>:2: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
arr1 = np.array([[1, None, arr_elem],
In [64]: arr1
Out[64]:
array([[1, None, array([3, 3, 3])],
[4, 5, nan],
[7, 'eight', 9]], dtype=object)
和以前一样,这是一个对象 dtype 数组,只是元素是一个数组。
In [65]: arr1 == None
<ipython-input-65-2a40a08151e4>:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
arr1 == None
Out[65]: False
它必须对每个元素进行== 测试。但是应用于数组元素的测试会产生一个布尔数组(与In[60] 相同)
In [66]: arr_elem==None
Out[66]: array([False, False, False])