微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

升级到 1.16 后,Numpy 数组不再扁平化输入

如何解决升级到 1.16 后,Numpy 数组不再扁平化输入

代码库从 numpy 1.15.2 升级到 1.16.6 并观察 numpy.array 行为的偏差。 python 版本 3.6.7。

以前的行为(numpy 1.15.2):

sequence=(1.5,1.5,array([5.]))
old_array = numpy.array(sequence)
print(old_array)
array([1.5,5.0])

新行为(numpy 1.16.6):

sequence=(1.5,array([5.]))
new_array = numpy.array(sequence)
print(new_array)
array([1.5,array([5.])],dtype=object)

在这些示例中,array([5]) 对应于单个元素的 numpy.ndarray。 Sequence 是传递给 numpy.array 函数的值元组。 1.15.2 版本的 numpy.array 基本上扁平化了单个元素数组,而 1.16.6 将其作为附加元素连接起来。

numpy 1.16.* 的发行说明中没有任何内容暗示数组创建函数的行为发生了变化。如果目标是简单地展平数组 numpy.hstack 可以工作,但是我正在寻找行为变化的解释,因为它可能对我正在升级代码库产生其他影响。

解决方法

在我的评论中,我专注于显示的变化,包括一个明确的 array 词。但是我在发行说明中找不到记录。即使没有,您的示例也应显示为 [1.5,1.5,[5.]]

但在当前版本 (1.19) 中:

In [99]: np.array([1.5,np.array(5)])
Out[99]: array([1.5,5. ])

这里的 0d np.array(5) 是“扁平化的”,与浮点数相同。

虽然一维数组产生参差不齐的警告(从 1.19 开始)和对象数据类型:

In [100]: np.array([1.5,np.array([5])])
<ipython-input-100-41ccaf61f1ba>: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
  np.array([1.5,np.array([5])])
Out[100]: array([1.5,array([5])],dtype=object)

如果我明确地将 dtype 设置为浮动:

In [101]: np.array([1.5,np.array([5])],float)
Out[101]: array([1.5,5. ])

因此有可能在 1.15 中,(1,) 数组被视为与 () 形状相同。

如果我有更早的版本,我会检查 dtype,并测试 np.array([1.5,np.array([1,2])]) 之类的表达式。

np.array 是一个复杂的函数。默认行为是创建一个多维数字(或字符串)dtype 数组。如果失败,它会退回到制作对象 dtype 数组(现在有警告)。但是对于某些形状组合,它会引发错误。

In [103]: np.array([np.ones((2,1)),np.ones((2,3))],object)
Traceback (most recent call last):
  File "<ipython-input-103-b2aa52476628>",line 1,in <module>
    np.array([np.ones((2,object)
ValueError: could not broadcast input array from shape (2,1) into shape (2)

VisibleDeprecationWarning 告诉我们,numpy 开发人员正在努力清理此 np.array 行为,消除经常使新手用户陷入困境的回退行为。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。