从Python int列表初始化numpy掩码数组时没有值
如问题的答案所示,如果我们强制使用dtype=float,则可以直接从一个无值列表中初始化一个掩码numpy数组。这些浮点值转换为nan,我们只需执行以下操作:从Python int列表初始化numpy掩码数组时没有值,python,arrays,numpy,Python,Arrays,Numpy,如问题的答案所示,如果我们强制使用dtype=float,则可以直接从一个无值列表中初始化一个掩码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) 基于Pytho
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整型列表初始化屏蔽数组的最有效方法是什么,该整型列表也不包含任何值,从而使这些值被屏蔽?您不能,但是您可以创建一个包含
对象数据类型
单元格的numpy数组
ma.masked\u无效(np.array(a,dtype=object),copy=False)
编辑
否则,您可以在这里查看一下到目前为止,我找到的最优雅的解决方案(一点也不优雅)是初始化类型为
float
的掩码数组,然后将其转换为int
:
ma.masked_invalid(np.array(a, dtype=float), copy=False).astype(int)
这将生成一个适当的NP数组,其中初始数组a
中的None
值被屏蔽。例如:
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])
可以通过首先创建两个空数组来实现这一点,一个数组的数据类型为
int
,将成为掩码ed数组,另一个数组的数据类型为bool,将成为掩码本身
然后我们遍历Python数组。在arr\u无_无
中,我们将所有出现的none
替换为默认值,并在mask\u 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)
我认为如果没有对象数据类型的临时数组,就不会有好的方法来实现这一点。确保您选择的解决方案不会以对象数据类型结尾。是的,但我最终需要int。完整的答案应该为我提供一个int类型的掩码数组。实现这一点最有效的方法是什么?似乎nan的还没有达到numpy int。那么通过object的最佳方法是什么?