有不同版本的“无”的合理方式?

2024-04-25 18:10:16 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3号工作。在

假设你有一百万只甲虫,你的任务是把它们斑点的大小分类。所以你要做一张表,每一行都是一只甲虫,行中的数字代表斑点的大小

 [[.3, 1.2, 0.5],
  [.6, .7],
  [1.4, .9, .5, .7],
  [.2, .3, .1, .7, .1]]

另外,您决定将它存储在一个numpy数组中,对于这个数组,您用None填充列表(numpy将把它转换为np.nan公司). 在

^{pr2}$

但是有一个问题,代表“无”的值可能有三个原因之一

  1. 甲虫没有很多斑点,这个数量是不存在的。

  2. 甲虫不会静止不动,你也无法测量这个点。

  3. 你还没来得及测量那只甲虫,所以价值是未分配的。

我的问题实际上并不涉及甲虫,但原理是一样的。 我想要3个不同的None值,这样我就可以保持这些缺失值的原因不同。我目前的解决方案是使用一个大到物理上不可能的值,但这不是一个非常安全的解决方案。在

假设您不能使用负数-实际上,我测量的数量可能是负数。

数据量大,读取速度很重要。在

评论正确地指出,说速度很重要,而不说什么操作有点无意义。主成分分析可能会被用于变量去相关,欧几里德距离平方计算的聚类算法(但数据在该变量是稀疏的)可能是一些插值。最终是一个递归神经网络,但那将来自一个库,所以我只需要将数据转换成一个输入形式。所以也许没有什么比线性代数更糟糕的了,如果我仔细考虑的话,它应该都适合内存。在

什么是好策略?在


Tags: 数据numpynone数量分类原因代表数字
3条回答

如果您只想要一个不是任何已知值且也不是None的对象,只需创建一个新对象:

NOT_APPLICABLE = object()
NOT_MEASURED = object()
UNKNOWN = object()

现在可以像使用None那样使用这些值:

^{pr2}$

等等

如果您需要一个可以表示为float的值(例如在numpy数组中),您可以用尾数编码的“额外”数据创建一个NaN值。然而,这样做可能不安全,因为不能保证通过对值的各种操作来保存这些位。在

最简单的方法是使用字符串:“not counted”、“unknown”和“N/A”。但是,如果您想在numpy中快速处理,那么具有混合数字/对象的数组不是您的朋友。在

我的建议是添加几个与数据形状相同的数组,由0和1组成。因此数组missing=1,其中spot丢失,其他为0,以此类推,与数组not_measured等相同。。在

然后,您可以在任何地方使用nan,然后使用np.where(missing == 1)屏蔽数据,以便轻松地找到所需的特定nan。在

建议为每个案例创建三个不同的object实例。在

由于您希望这些对象具有NaN的属性,因此可以尝试创建三个不同的NaN实例。在

NOT_APPLICABLE = float("nan")
NOT_MEASURED = float("nan")
UNKNOWN = float("nan")

这是一个黑客攻击的极限,因此使用风险自负,但我不相信任何Python实现都会优化NaN来始终重用同一个对象。不过,您可以添加一个sentinel条件,以便在运行之前进行检查。在

^{pr2}$

如果这样做的话,这样做的好处是允许您比较NaNid以检查其含义。在

row = [1.0, 2.4, UNKNOWN]

...

if value is UNKNOWN:
    ...

同时,它保留了numpy可能对其数组进行的任何优化。在

披露:这是一个老生常谈的建议,我很想听听别人的意见。

相关问题 更多 >