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

new9mtju  于 12个月前  发布在  Python
关注(0)|答案(4)|浏览(101)

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

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

但我得到了以下结果:

<type 'numpy.float64'>

有人知道为什么类型没有改为str吗?如何正确地改变X的列类型?谢谢你,谢谢

00jrzges

00jrzges1#

举一个简单的例子会更好地解释它。

>>> 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]])
j8yoct9x

j8yoct9x2#

让我回答第二个问题,因为我遇到了同样的问题。
正如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'>
sxpgvts3

sxpgvts33#

更明确和直接的答案。类型未更改为str,因为NumPy数组应该只有一种数据类型。更改X的列类型的正确方法是使用structured arrays或此question中的一种解决方案。
我也有同样的问题,我不想使用结构化数组。一个可能的选择是使用pandas,如果它适合您的任务。如果你只想改变一列,这可能意味着你的数据是表格式的。然后您可以轻松地更改列的数据类型。另一种折衷方法是复制列,并将其与原始数组分开使用。

>>> 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
9rnv2umw

9rnv2umw4#

当我面临同样的问题时,我使用了这个快速的一行解决方案

>>> X = np.array([[1,2],[3,4],[5,6]])
    [[1 2]
     [3 4]
     [5 6]]

>>> X_1 = np.array([[x,str(y)] for x,y in X],dtype='O')
   [[1 '2']
    [3 '4']
    [5 '6']]

可能有点过于复杂,但工作。:)

相关问题