【发布时间】:2021-02-09 06:25:21
【问题描述】:
将代码库从 numpy 1.15.2 升级到 1.16.6 并观察 numpy.array 行为的偏差。 python版本3.6.7。
以前的行为(numpy 1.15.2):
sequence=(1.5, 1.5, 1.5, 1.5, array([5.]))
old_array = numpy.array(sequence)
print(old_array)
array([1.5, 1.5, 1.5, 1.5, 5.0])
新行为(numpy 1.16.6):
sequence=(1.5, 1.5, 1.5, 1.5, array([5.]))
new_array = numpy.array(sequence)
print(new_array)
array([1.5, 1.5, 1.5, 1.5, array([5.])], dtype=object)
在这些示例中,array([5]) 对应于单个元素的 numpy.ndarray。序列是传递给 numpy.array 函数的值元组。在 1.15.2 版本中,numpy.array 基本上将单个元素数组展平,而 1.16.6 将其连接为附加元素。
numpy 1.16.* 的发行说明中没有任何内容似乎暗示数组创建函数的行为发生了变化。如果目标是简单地展平数组 numpy.hstack 可以工作,但是我正在寻找行为变化的解释,因为它可能会对我正在升级的代码库产生其他影响。
【问题讨论】:
-
早期版本中的
dtype是什么。如果那是准确的复制粘贴,我怀疑只是显示发生了变化,而不是实际的展平。请注意,5是整数,而不是像其他元素一样浮动。 -
@hpaulj 很抱歉这是一个转录错误。内部数组中的值是一个浮点数,使得序列 = (1.5, 1.5, 1.5, 1.5, array([5.])。似乎改变的是 numpy.array 从将序列视为浮点数变为它们作为对象。
-
每当我这样做一段时间后,我都会收到此警告,大概是在行为改变之前:
<stdin>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray -
@juanpa.arrivillaga 可能是相关的。我有兴趣理解的行为是,在某些时候 numpy.array 从将我的示例中的 dtype 推断为 numpy.float64 更改为将其推断为对象。如果我明确地将 dtype=numpy.float64 传递给 numpy.array 调用,则行为与 numpy 1.15 的行为匹配。我主要只是对为什么会发生这种变化感兴趣。
标签: python numpy numpy-ndarray