我正在使用numpy的数组对象的astype方法将数组从字符转换为整数。为了效率,我使用copy = False,但我注意到原始数组实际上没有被修改。如果不将b声明为新数组,那怎么可能呢?
import numpy
a=numpy.array(['0','1'])
b=a.astype(numpy.int32,copy=False)
print a[0], b[0]
答案 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
在另一个答案中提及,但由于与此处相同的原因而失败 - 它无法在不更改原始数组的情况下执行转换。