繁体   English   中英

对于numpy.astype的copy属性感到困惑

[英]confused about the `copy` attribution of `numpy.astype`

我对numpy.astypecopy归因感到困惑。 我检查了链接中的材料,它说:

By default, astype always returns a newly allocated array. If this is set to false, and the dtype, order, and subok requirements are satisfied, the input array is returned instead of a copy.

这意味着将更改ndarray对象的原始值? 喜欢:

x = np.array([1, 2, 2.5])
x.astype(int, copy=False)

但似乎x仍然是原始值array([ 1. , 2. , 2.5]) 有人可以解释吗? 非常感谢你~~

它们的意思是,如果原始数组完全符合您传递的规范,即具有正确的dtype,majority并且不是子类或您设置了subok标志,那么将避免复制。 输入数组永远不会被修改。 在您的示例中,dtypes不匹配,因此无论如何都会创建一个新数组。

如果您不希望复制数据,请使用view。 这将尽可能根据您的规范重新解释数据缓冲区。

x = np.array([1, 2, 2.5])
y = x.view(int)
y
#  array([4607182418800017408, 4611686018427387904, 4612811918334230528])
# y and x share the same data buffer:
y[...] = 0
x
# array([ 0.,  0.,  0.])

默认情况下,astype始终返回新分配的数组。 如果将其设置为false,并且满足dtype,order和subok要求,则返回输入数组,而不是副本。

请注意,您引用的文档根本没有提到x被修改-实际上,返回的是所需类型的全新数组,或者x返回的是未修改的(如果可能)。

就您而言,我认为x不符合dtype要求。 该文档实际上根本没有描述该要求(因此我可以理解您的困惑),但是基本上这意味着所请求的dtype (在这种情况下为int )必须能够完全代表原始dtype所有值( float在这种情况下)。 由于您不能在不丢失某些信息的情况下将float填充到int ,因此不能简单地假装x是一个int数组。

这样, astype返回x的新副本 ,每个值都转换为int 它使x astype ,因此要获取转换后的数组,您需要检查astype返回的值:

x = np.array([1, 2, 2.5])
y = x.astype(int, copy=False)

print x # prints array([ 1. ,  2. ,  2.5]), since x hasn't been modified
print y # prints array([ 1. ,  2. ,  2]), since y is an integer-valued copy of x

在这种情况下, copy=False起作用,返回原始数组:

In [238]: x
Out[238]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [239]: y = x.astype(int,copy=False)
In [240]: id(x)
Out[240]: 2884971680
In [241]: id(y)
Out[241]: 2884971680     # same id

In [242]: z = x.astype(int)
In [243]: id(z)
Out[243]: 2812517656     # different id

从某种意义上说,这是个小事。 但如果其他所有情况都一样琐碎,我也不会感到惊讶

In [244]: w = x.astype(int,order='F',copy=False)
In [245]: id(w)
Out[245]: 2884971680   # 1d array is both order C and F

换句话说,如果需要dtypeorder不需要任何更改,它将返回原始数组。 那就是如果原件已经符合规格。

这与view 视图是一个新数组(新ID),但共享数据缓冲区。 相反,它更像是更简单的Python分配y = x

如果有人可以解决涉及dtype更改的copy=False案例,我可能会改变主意。


相同的调用,但使用不同的数组将创建一个副本

In [249]: x1=np.arange(10.)      # float
In [250]: y1=x1.astype(int, copy=False)
In [251]: id(x1)
Out[251]: 2812517696
In [253]: id(y1)
Out[253]: 2812420768        # different id
In [254]: y1=x1.astype(float, copy=False)
In [255]: id(y1)
Out[255]: 2812517696

因此,如果需要,可以使用copy=False ,比如说一个int dtype数组,但是如果该数组已经是int ,那么效率不会受到任何损失。


将标量转换为numpy数组的有效方法

copy=False np.array行为大致相同-如果不需要转换,则返回相同的数组(id)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM