python numpy:更改numpy矩阵的列类型

时间:2016-04-09 19:07:28

标签: python numpy types

我有一个numpy矩阵X,我尝试使用下面的代码更改第1列的数据类型:

X[:, 1].astype('str')
print(type(X[0, 1]))

但我得到了以下结果:

<type 'numpy.float64'>

任何人都知道为什么类型没有改为str? 什么是更改X列类型的正确方法?谢谢!

3 个答案:

答案 0 :(得分:4)

提供一个简单的例子可以更好地解释它。

>>> a = np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
       [4, 5, 6]])
>>> a[:,1]
array([2, 5])
>>> a[:,1].astype('str') # This generates copy and then cast.
array(['2', '5'], dtype='<U21')
>>> a                    # So the original array did not change.
array([[1, 2, 3],
       [4, 5, 6]])

答案 1 :(得分:0)

更清晰直接的答案。该类型未更改为str,因为NumPy数组应仅具有一种数据类型。更改X列类型的正确方法是使用structured arrays或此question的解决方案之一。

我遇到了同样的问题,并且我不想使用结构化数组。如果适合您的任务,可以选择使用熊猫。如果仅更改一列,则可能意味着您的数据是表格格式的。然后,您可以轻松更改列的数据类型。另一个折衷方案是复制该列,并将其与原始数组分开使用。

>>> x = np.ones((3, 3), dtype=np.float)
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
>>> x[:, 1] = x[:, 1].astype(np.int)
>>> type(x[:, 1][0])
numpy.float64
>>> x_pd = pd.DataFrame(x)
>>> x_pd[1] = x_pd[1].astype(np.int16)
>>> type(x_pd[1][0])
numpy.int16

答案 2 :(得分:0)

因为我也遇到了同样的问题,所以让我回答第二个问题。

正如 dinarkino 所提到的,只是将类型分配回去是行不通的。

>>> X = np.array([[1.1,2.2],[3.3,4.4]])
>>> print(X[:,1].dtype)
<class 'numpy.float64'>

>>> X[:,1] = X[:,1].astype('str')
>>> print(X[:,1].dtype)
<class 'numpy.float64'>

所以我的方法是首先将整个矩阵的 dtypes 分配给 'object',然后将 str 数据类型分配回来。

>>> X = X.astype('object')
>>> print(type(X[0,1]))
<class 'float'>

>>> X[:,1] = X[:,1].astype('str')
>>> print(type(X[0,1]))
<class 'str'>