Numpy空列表类型推断
为什么[]在使用时将空列表推断为浮点类型np.append?
np.append([1,2,3], [0])
# output: array([1, 2, 3, 0]), dtype = np.int64
np.append([1,2,3], [])
# output: array([1., 2., 3.]), dtype = np.float64
即使使用np.array([1,2,3], dtype=np.int32)as ,这也是持久的arr。
无法为 append 指定 dtype,所以我很好奇为什么会发生这种情况。Numpy 的 concatenate 做同样的事情,但是当我尝试指定 dtype 时,我收到一个错误:
np.concatenate([[1,2,3], []], dtype=np.int64)
错误:
TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'same_kind'
但最后,如果我设置了不安全的铸造规则,它会起作用:
np.concatenate([[1,2,3], []], dtype=np.int64, casting='unsafe')
为什么被[]认为是浮动?
回答
np.append受定义明确的语义规则的约束,就像任何 Numpy 二元运算一样。其结果是,它首先将所输入的操作数numpy的阵列,如果这不是这种情况(通常np.array),然后应用语义规则来查找所得到的阵列的类型,并检查它是一个有效的操作施加的实际操作之前(这里是串联)。np.array关于文档,由返回的数组类型被“确定为保持序列中对象所需的最小类型”。当列表为空时,就像您的情况一样,默认类型numpy.float64如np.empty. 这个随意的选择很久以前制作的,并且为了不破坏旧代码而没有改变。请注意,似乎并非所有 Numpy 开发人员都同意当前的选择,因此这是一个有争议的问题。有关更多信息,您可以阅读此打开的问题。
经验法则是使用现有的 Numpy 数组或使用np.array固定dtype参数(如上述评论中所述)执行显式转换为 Numpy 数组。