这与其他问题不同,例如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
总结:如何将单个列更改为特定数据类型?
答案 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]来实现访问特定列。
在特定的“#”列中提取的结果。生成列表/元组,如果函数需要数组而不是列表/元组,则将列表/元组转换为数组。
谢谢,
来自阳光明媚的悉尼的安东尼