【问题标题】:An issue with np.nan when using it to replace all elements of an array使用 np.nan 替换数组的所有元素时出现问题
【发布时间】:2020-05-16 00:15:22
【问题描述】:

这是一个一维数组:

a = np.array([1, 2, 3])

我正在尝试用np.nan 替换所有元素。当然,我会尝试:

a[:] = np.nan

最终返回:

array([-9223372036854775808, -9223372036854775808, -9223372036854775808])

所以问题很简单:为什么它不起作用。

附:目前我只是在使用

a = np.array([np.nan for a_i in a])

实现我想做的事情。

【问题讨论】:

  • np.full_like(a, np.nan, dtype=float) 也可以使用
  • 事实上这是 NumPy 中的一个错误。默认情况下,NumPy 尝试将任何分配的值转换为数组类型。所以如果你做了a[:] =1.3 你只会得到一个数组,因为a 类型是整数。但是,从np.nan 到整数的转换没有明确定义,实际上a[0] = np.nan 失败了,但似乎切片分配操作没有正确执行此检查。
  • @jdehesa np.iinfo(np.int64) ==> iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64) ...所以这不是错误,而是尝试返回与可能被视为 nodata 的适当整数 dtype 相关联的内容
  • 其实已经是报过的问题了:Nan are converted to int with slicing #4592
  • @cssstudent 这是因为np.full_like(a) 在构造新数组时复制了adtype(当没有给出其他dtype 时)并且np.full(len(a)) 使用默认的dtype (它是浮点数)在构造新数组时。

标签: python arrays numpy nan


【解决方案1】:

您的数组正在使用dtype='int64' 创建。如果您将数组创建为浮点数组,它将起作用。

a = np.array([1, 2, 3], dtype=float)
a[:] = np.nan
print(a)

会给

[nan nan nan]

或者,您可以在初始列表中使用至少一个浮点数来创建数组(但最好是明确的)

a = np.array([1., 2, 3])
a[:] = np.nan
print(a)

给予

[nan nan nan]

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多