Python在矩阵/数组中更改单个数据类型 - 例如int,float,binary

时间:2018-04-23 22:36:36

标签: python arrays matrix types type-conversion

这与其他问题不同,例如Store different datatypes in one NumPy array?。我无法在“可能重复的问题”中看到矩阵。问题看起来不像矩阵。

我有兴趣更改矩阵中的特定数据类型。

我想有一个混合数据类型的矩阵。那是想改变单个列的数据类型:我将用原始矩阵和我想做的事情来说明。原始矩阵的类型为float64。

mymatrix
array([[17.        , 27.        , 19.62120627, 21.        ,  0.        ],
       [10.        ,  1.        , 18.94042755,  0.        ,  0.        ],
       [11.        , 53.        , 13.96885424, 29.        ,  0.        ],
       [ 8.        ,  1.        , 19.36688898,  0.        ,  1.        ],
       [ 8.        , 44.        , 19.26500703, 29.        ,  1.        ],
       [16.        ,  2.        , 27.31823044,  0.        ,  1.        ]])

但我希望各列的类型不同:i2,i2,f8,i2 ,?也就是说,矩阵中的列的类型为int16,int16,float64,int16和binary。

请参阅https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html中间的参考资料。建议的答案Store different datatypes in one NumPy array?也与我的需求无关。

例如: 我在原始矩阵中有第一行

array([[17.        , 27.        , 19.62120627, 21.        ,  0.        ]

但我想

array([[17,27,19.62120627,21, False]

这是我的列分别是类型:i2,i2,f8,i2 ,?那就是我希望我的整个矩阵如上所示具有int16,int16,float64,int16和binary类型的列。

回想一下,参考文献是中途向下看参考文献中间https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

总结:如何将单个列更改为特定数据类型?

1 个答案:

答案 0 :(得分:0)

Python改变矩阵/数组中的各个数据类型 - 例如int,float,binary

这比我问的问题要好。它解决了一个人是否可以在矩阵中拥有不同类型的数据。

你可以但不能直接作为矩阵。

最初数据是一个包含整数,浮点和布尔类型的列表,如下面的列表所示:

mylist 
[[17, 27, 19.6212062712054, 21, False], 
[10, 1, 18.940427553737198, 0, False], 
[10, 17, 19.123083111577685, 6, False], 
[7, 5, 22.943202316685845, 0, False], 
[15, 40, 14.983843150392211, 29, False],
[11, 53, 13.968854243956049, 29, False], 
[8, 1, 19.366888983233444, 0, True],
[8, 44, 19.265007030047215, 29, True], 
[7, 7, 23.485663475594826, 0, True],
[16, 16, 25.42215007204769, 0, True], 
[3, 21, 10.787963908414609, 22, False]]

假设我想选择第一列或最后一列,例如以下两个例子:

[17, 10, 10, 7, 15, 11, 8, 8, 7, 16, 3]

[False, False, False, False, False, False, True, True, True, True, False]

执行相应操作的列表无法执行此操作:

mylist[0]

OR

mylist[4]

如果您将mylist转换为myarray,您将获得统一转换:

import numpy as np
myarray = np.array(mylist)
>>> myarray
array([[17.        , 27.        , 19.62120627, 21.        ,  0.        ],
       [10.        ,  1.        , 18.94042755,  0.        ,  0.        ],
       [10.        , 17.        , 19.12308311,  6.        ,  0.        ],
       [ 7.        ,  5.        , 22.94320232,  0.        ,  0.        ],
       [15.        , 40.        , 14.98384315, 29.        ,  0.        ],
       [11.        , 53.        , 13.96885424, 29.        ,  0.        ],
       [ 8.        ,  1.        , 19.36688898,  0.        ,  1.        ],
       [ 8.        , 44.        , 19.26500703, 29.        ,  1.        ],
       [ 7.        ,  7.        , 23.48566348,  0.        ,  1.        ],
       [16.        , 16.        , 25.42215007,  0.        ,  1.        ],
       [ 3.        , 21.        , 10.78796391, 22.        ,  0.        ]])

观察所有整数都转换为浮点数,并且所有布尔值都转换为浮点数和零值。

可以提取列

>>> myarray[:,0]
array([17., 10., 10.,  7., 15., 11.,  8.,  8.,  7., 16.,  3.])
>>> myarray[:,4]
array([0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0.])

此外,如果您尝试通过单独设置列将列表转换为数组,则会获得 古怪的输出

myarray = np.array(mylist, dtype='i2,i2,f8,i2,?')

关于dtype = https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html的参考 为了说明,虽然没有错误消息。但我确实得到了这个莫名其妙的输出 这是一个摘录:

myarray
array([[(17, 17, 17.        , 17,  True),
        (27, 27, 27.        , 27,  True),
        (19, 19, 19.62120627, 19,  True),
        (21, 21, 21.        , 21,  True),
        ( 0,  0,  0.        ,  0, False)],
       [(10, 10, 10.        , 10,  True),
        ( 1,  1,  1.        ,  1,  True),
        (18, 18, 18.94042755, 18,  True),
        ( 0,  0,  0.        ,  0, False),
        ( 0,  0,  0.        ,  0, False)],
       [(10, 10, 10.        , 10,  True),  etc

但是,我仍然想要不同dtypes的变量,但是像数组一样处理它。

受到TypeError: 'zip' object is not subscriptable的想法的启发,我能够提取类似于'的列。但不完全像从矩阵中获取列,我可以从列表中获取列。

mylist2 = list(zip(*mylist))
>>> mylist2[0]; #Get the first column
(17, 10, 10, 7, 15, 11, 8, 8, 7, 16, 3)
>>> mylist2[4]; #Get the fifth column
(False, False, False, False, False, False, True, True, True, True, False)

当然,如果它正在使用数组,那么数组的特定列将被访问为myarray [:,0]和myarray [:,4]而不是相应的mylist2 [0]和mylist2 [4] ]

如果任何函数或过程需要数组而不是列表,则可以通过以下方式将所选列转换为数组:

firstcolarray = np.array(mylist2[0])
fifthcolarray = np.array(mylist2[4])

>>> firstcolarray
array([17, 10, 10,  7, 15, 11,  8,  8,  7, 16,  3])
>>> fifthcolarray
array([False, False, False, False, False, False,  True,  True,  True,
        True, False])

结论:虽然矩阵中不能有不同的数据类型,但您可以在列表中使用不同的数据类型,但列出压缩的*列表。如果数据结构是矩阵/数组,则使用[col no -1]而不是[:,col no -1]来实现访问特定列。

在特定的“#”列中提取的结果。生成列表/元组,如果函数需要数组而不是列表/元组,则将列表/元组转换为数组。

谢谢,

来自阳光明媚的悉尼的安东尼