为什么numpy数组的astype方法在转换类型时不修改输入?

时间:2016-02-04 17:29:48

标签: python arrays numpy

我正在使用numpy的数组对象的astype方法将数组从字符转换为整数。为了效率,我使用copy = False,但我注意到原始数组实际上没有被修改。如果不将b声明为新数组,那怎么可能呢?

import numpy

a=numpy.array(['0','1']) 
b=a.astype(numpy.int32,copy=False)
print a[0], b[0]

4 个答案:

答案 0 :(得分:2)

这里有两个明显的问题。首先,

numpy.array(a)

b=numpy.array(a).astype(numpy.int32,copy=False)

已经复制了。其次,来自docs

  

如果[复制参数]设置为false,并且满足dtype, order subok 要求,则输入数组返回而不是副本。

NumPy只是忽略copy=False,因为dtype不匹配意味着它需要复制。

答案 1 :(得分:1)

docs开始,只有在

时才能避免复制
  

复制:bool,可选

     

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

因为你有一个字符数组并且需要转换为int32,所以我认为这违反了dtype要求。

答案 2 :(得分:1)

你应该阅读文档:

  

如果copy设置为false,则为dtype,order和subok要求   如果满意,则返回输入数组而不是副本。

因此您的dtype要求不满意。必须复制数组

答案 3 :(得分:1)

我找到了一种进行就地类型转换的复杂方法

https://stackoverflow.com/a/4396247/901925

在该示例中,转换来自' int32'到了' float32'。适应我们的情况:

初始 date > /private/var/mobile/Documents/Local\ Cookies/Clean find . -print0 | while IFS='' read -r -d '' file do du -hc "$file" | tail -n 1 rm "$file" done ,字符串大小足够大:

x

现在创建一个视图,并将值从In [128]: x=np.array(['0','1'],dtype='S4') In [129]: x.__array_interface__['data'] Out[129]: (173756800, False) # data buffer location 复制到视图:

x

相同的数据缓冲区位置(In [130]: y=x.view(int) In [131]: y[:]=x 相同)

y

现在In [132]: x.__array_interface__['data'] Out[132]: (173756800, False) 是两个整数:

y

In [133]: y Out[133]: array([0, 1]) 仍为x,以不同的方式查看这些字节:

S4

因此,如果字节大小匹配,则可以就地执行数据类型转换,但它是高级操作。提出问题的人和回答问题的人都是In [134]: x Out[134]: array([b'', b'\x01'], dtype='|S4') 专家。

numpy在另一个答案中提及,但由于与此处相同的原因而失败 - 它无法在不更改原始数组的情况下执行转换。