如问题Convert python list with None values to numpy array with nan values的答案所示,如果我们强制执行dtype = float,则可以直接从具有None值的列表初始化屏蔽的numpy数组。这些浮点值转换为nan,我们可以简单地执行:
ma.masked_invalid(np.array(a, dtype=float), copy=False)
然而,这不适用于int:
ma.masked_invalid(np.array(a, dtype=int), copy=False)
因为中间的np.array不会使用None值创建(没有int nan)。
基于Python的int列表初始化掩码数组的最有效方法是什么,这些int也包含None值,以便这些None值被掩盖?
答案 0 :(得分:3)
到目前为止我找到的最优雅的解决方案(并不优雅)是初始化float
类型的蒙版数组,然后将其转换为int
:
ma.masked_invalid(np.array(a, dtype=float), copy=False).astype(int)
这会生成一个正确的NP数组,其中初始数组None
中的a
值被屏蔽。例如,对于:
a = [1, 2, 3, None, 4]
ma.masked_invalid(np.array(a, dtype=float), copy=False).astype(int)
我们得到:
masked_array(data = [1 2 3 -- 4],
mask = [False False False True False],
fill_value = 999999)
此外,实际的掩码int值变为min int,即
ma.masked_invalid(np.array(column, dtype=float), copy=False).astype(int).data
给出:
array([ 1, 2, 3,
-9223372036854775808, 4])
答案 1 :(得分:0)
你不能,但是你可以创建一个object dtype
个小区的numpy数组
ma.masked_invalid(np.array(a, dtype=object), copy=False)
修改强>
否则你可以看看NumPy or Pandas: Keeping array type as integer while having a NaN value
答案 2 :(得分:0)
可以通过首先创建两个空数组来实现此目的,其中一个数组的数据类型为int
将成为掩码 ed 数组,另一个数组的数据类型为bool则将成为掩码本身
然后我们遍历Python数组。在arr_without_none
中,将所有出现的None
替换为默认值,在mask_mat
中,我们存储Python数组中的原始值是None
还是整数。最后,我们从这两个组件中生成一个蒙版数组。
def masked_int_array(arr, default=0):
arr_without_none = numpy.empty(len(arr), dtype=int)
mask_mat = numpy.empty(len(arr), dtype=bool)
for i in range(len(arr)):
arr_without_none[i] = default if arr[i] is None else arr[i]
mask_mat[i] = arr[i] is None
return ma.array(data=arr_without_none, dtype=int, mask=mask_mat, copy=False)