使用无值

时间:2015-05-20 02:19:24

标签: python arrays numpy

如问题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值被掩盖?

3 个答案:

答案 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)