Numpy: np.copy(掩码数组)具有意外行为

创建于 2013-06-26  ·  11评论  ·  资料来源: numpy/numpy

....其中“意外”表示_I_没想到。 这可能只是一个文档修复程序,或者也许是因为我没有意识到np.ma工作方式而受到责骂,但我认为这种行为不适当:

In [100]: x = np.ma.ones(5)

In [101]: x.mask = [False,False,True,False,False]

In [102]: np.copy(x)
Out[102]: array([ 1.,  1.,  1.,  1.,  1.])

In [103]: np.ma.copy(x)
Out[103]:
masked_array(data = [1.0 1.0 -- 1.0 1.0],
             mask = [False False  True False False],
       fill_value = 1e+20)

In [104]: np.__version__
Out[104]: '1.8.0.dev-074a40c'

我至少希望收到警告,但希望按偏好顺序查看:

  • np.copy(x)返回掩码数组(因为x是掩码数组)
  • np.copy(x)警告它正在取消屏蔽数组,然后返回与上面相同的数组
  • np.copy(x)引发异常
  • np.copy(x)返回[1,1,nan,1,1] (这可能不理想)
00 - Bug numpy.lib

所有11条评论

仍在1.9-devel中打开

但是,如果不使用特殊的无框遮罩阵列,则不确定如何解决此问题。

将np.copy的逻辑更改subok=True在数组调用中包含
从:

return array(a, order=order, copy=True)

至:

return array(a, order=order, subok=True, copy=True)

如果是这样,subok应该是np.copy的参数,默认值是True还是False? True将返回第一个首选结果,False将保留当前行为,但允许预期的行为但添加一个参数。

当我们已经有两个完全可行的解决方案时,我不赞成在np.copy中添加subok参数:

  • 使用.copy()方法
  • 使用np.array(a, subok=True) (默认复制)

我实际上会提出相反的意见,因为我认为大多数“副本”都会给人一种印象,那就是实际上可以得到一份副本,因此是同一类型。 我还认为这是一个小小的但有用的贡献,它使整个numpy能够更一致地处理子类(就像我之前使用np.broadcast_arrays所做的那样,那里没有好的替代品)。 但是,鉴于需要保持向后兼容,我确实认为我们坚持使用subok=False的默认值。

无论如何, @jjhelmus ,为什么不做快速公关来看看别人的想法呢?

@shoyer :np.copy应该应该放在您需要的功能列表中
不过,某种形式的Duck数组支持-对于鸭子数组,我认为np.copy
和np.array可能应该做不同的事情。 也许应该打电话
arr.copy?

在2015年10月15日星期四上午7:00,Marten van Kerkwijk <
[email protected]>写道:

我实际上会提出相反的意见,因为我认为大多数“复制”都可以
给人的印象是,实际上是一份副本,
因此属于同一类型。 我也认为这是很小但有用的贡献
使整个numpy更一致地能够处理子类
(就像我之前对np.broadcast_arrays所做的一样,没有很好的替代品
可用)。 但是,鉴于需要保持向后兼容,我
确实认为我们被默认为subok = False。

无论如何, @jjhelmus https://github.com/jjhelmus ,为什么不做快速公关
看看别人的想法吗?

-
直接回复此电子邮件或在GitHub上查看
https://github.com/numpy/numpy/issues/3474#issuecomment -148395201。

纳撒尼尔·史密斯(Nathaniel J.Smith)-http: //vorpus.org

是的,如果要使np.copy尝试在duck数组上调用copy方法,我将为+1。

仍然没有理由不支持subok 。 当然,只要存在__copy__ ,就可以调用它。

创建PR#6509,它向功能添加一个subok参数,默认值为False 。 我猜这将打开有关该主题的一些讨论。 不知道这是否通常发生在PR,问题或邮件列表上。

讨论应该在邮件列表中。
2015年10月18日下午7:37,“ Jonathan J. Helmus”通知@ github.com
写道:

创建了PR#6509 https://github.com/numpy/numpy/pull/6509 ,其中添加了一个
函数的_subok_参数,默认值为_False_。 我是
猜测这将打开有关该主题的一些讨论。 不确定这是否
通常发生在PR,问题或邮件列表上。

-
直接回复此电子邮件或在GitHub上查看
https://github.com/numpy/numpy/issues/3474#issuecomment -149080511。

明天我将向该主题的列表发送电子邮件。

此页面是否有帮助?
0 / 5 - 0 等级