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

2024-04-26 12:15:53 发布

您现在位置:Python中文网/ 问答频道 /正文

这与其他问题不同,例如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

Sum:如何将单个列更改为特定的数据类型?你知道吗


Tags: storeinnumpy类型矩阵arrayone数据类型
1条回答
网友
1楼 · 发布于 2024-04-26 12:15:53

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]

或者

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

请注意,所有整数都转换为浮点,所有布尔值都转换为浮点1和零。你知道吗

可以提取列

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

但是,我仍然需要不同数据类型的变量,但是像数组一样处理它。你知道吗

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]而不是像jt那样使用[:,col no-1],如果数据结构是矩阵/数组的话。你知道吗

当特定“列”的结果提取产生列表/元组时,如果函数需要数组而不是列表/元组,则需要将列表/元组转换为数组。你知道吗

谢谢你

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

相关问题 更多 >