我有一个整数的numpyarray.在我的代码中,我需要从列表中附加一些其他整数,这样可以很好地工作,并按预期返回一个dtypeint64array.但可能会出现要附加的整数列表为空的情况.在这种情况下,numpy返回float64个值的array.示例代码如下:

import numpy as np

a = np.arange(10, dtype='int64')

np.append(a, [10])  # dtype is int64
# array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

np.append(a, [])    # dtype is float64
# array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

这是预期的行为吗?如果是,这背后的理由是什么?这可能是个bug吗?

np.append的文档说明返回值为

arr的副本,axis后附有values.

既然没有要附加的值,它不应该只返回数组的副本吗?

(NUMPY版本:1.22.4,Python版本:3.8.0)

推荐答案

从空列表构造的numpy数组的默认值为float64:

>>> np.array([])
array([], dtype=float64)

float64数据类型将"战胜"int64数据类型,并将所有内容提升到float64,因为反过来转换会导致精度损失(即截断任何float64).当然,这是一种极端情况,因为在空数组中没有要截断的值,但只在dtype上进行判断.更多信息见the doc for numpy.result_type()页.

事实上:

>>> a = np.array(dtype='int64')
>>> a
array([], dtype=int64)

>>> b = np.array([])
>>> b
array([], dtype=float64)

>>> np.result_type(a, b)
dtype('float64')

np.promote_types()函数用于确定要升级到的类型:

>>> np.promote_types('int64', 'float64')
dtype('float64')

另请参见:How the dtype of numpy array is calculated internally?

Python相关问答推荐

点到面的Y距离

根据另一列中的nan重置值后重新加权Pandas列

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

我们可以为Flask模型中的id字段主键设置默认uuid吗

我如何根据前一个连续数字改变一串数字?

在含噪声的3D点网格中识别4连通点模式

使用groupby方法移除公共子字符串

使用__json__的 pyramid 在客户端返回意外格式

用两个字符串构建回文

根据客户端是否正在传输响应来更改基于Flask的API的行为

判断Python操作:如何从字面上得到所有decorator ?

一个telegram 机器人应该发送一个测验如何做?""

仅使用预先计算的排序获取排序元素

提取最内层嵌套链接

无法在盐流道中获得柱子

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?

如何在Polars中处理用户自定义函数的多行结果?

如何在微调Whisper模型时更改数据集?

Sknowled线性回归()不需要迭代和学习率作为参数

如何有效地计算所有输出相对于参数的梯度?