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

Python 为什么numpy数组';s astype方法在转换类型时不修改输入?,python,arrays,numpy,Python,Arrays,Numpy,我正在使用numpy的array对象的astype方法将数组从字符转换为整数。为了提高效率,我使用copy=False,但我注意到原始数组实际上没有被修改。如果不将b声明为新数组,这怎么可能呢 import numpy a=numpy.array(['0','1']) b=a.astype(numpy.int32,copy=False) print a[0], b[0] 从中,只有在以下情况下才避免复制: 副本:bool,可选 默认情况下,astype始终返回新分配的数组。如果将其设置为f

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

import numpy

a=numpy.array(['0','1']) 
b=a.astype(numpy.int32,copy=False)
print a[0], b[0]
从中,只有在以下情况下才避免复制:

副本:bool,可选

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

因为您有一个字符数组,它需要转换为int32,所以我假设这违反了数据类型要求。

从中,只有在

副本:bool,可选

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


因为您有一个字符数组,它需要转换为int32,所以我假设这违反了数据类型要求。

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

numpy.array(a)

已经复制了一份。第二,从以下方面:

如果[复制参数]设置为false,并且满足了数据类型、顺序和子任务要求,则返回输入数组而不是副本


NumPy只是忽略了
copy=False
,因为数据类型不匹配意味着它需要复制。

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

numpy.array(a)

已经复制了一份。第二,从以下方面:

如果[复制参数]设置为false,并且满足了数据类型、顺序和子任务要求,则返回输入数组而不是副本


NumPy只是忽略了
copy=False
,因为数据类型不匹配意味着它需要复制。

您应该阅读文档:

如果copy设置为false,则数据类型、顺序和subok要求 如果满足,则返回输入数组而不是副本


因此,您的数据类型需求没有得到满足。必须复制阵列

您应该阅读以下文档:

如果copy设置为false,则数据类型、顺序和subok要求 如果满足,则返回输入数组而不是副本


因此,您的数据类型需求没有得到满足。必须复制数组

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

在该示例中,转换是从“int32”到“float32”。适应我们的情况:

初始
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
相同)

现在
y
是两个整数:

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

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


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

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

在该示例中,转换是从“int32”到“float32”。适应我们的情况:

初始
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
相同)

现在
y
是两个整数:

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

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


和<代码> Atdiype,拷贝= false <代码>在另一个答案中被提及,但是失败的原因与这里一样——它不能在不改变原始数组的情况下执行转换。

右,考虑NUMPY。数组(A)作为一个巨大的类型::正确,考虑NUMPY。数组(A)作为一个巨大的类型::比较<代码> A.NByth和<代码> B.NbEys<代码>。一个是2,另一个是8。您和numpy无法将2个4字节整数压缩到2个1字节字符槽中。请比较
a.nbytes
b.nbytes
。一个是2,另一个是8。您和numpy无法将2个4字节整数压缩到2个1字节字符槽中。