为np.array指定dtype后shape发生改变,如何在指定dtype时保留原数组形状
你之所以指定dtype后数组形状发生变化,是因为你传入的dtype是结构化数组的定义格式:当numpy检测到dtype是由(字段名, 类型)组成的列表时,会自动把输入数据里的每个子元组识别为一个独立的复合类型元素,所以原来的4个元组对应4个结构化元素,最终得到一维的(4,)数组,这是numpy的设计逻辑。
接下来分两种常见场景给出对应解决方案:
场景1:仅需要统一数组元素类型,不需要给每列设置字段名
直接把dtype指定为单个类型即可,不要用结构化的列表格式:
>>> # 直接指定全局dtype为int >>> arr_d = np.array(blender, dtype='int') >>> arr_d.shape (4, 3) >>> arr_d array([[ 1, 1, 2], [ -1, 0, -101], [ 1, 1, 2], [ -1, 0, -101]])
这个方案得到的数组形状和你原来的arr完全一致,同时所有元素都被转换为int类型。
场景2:确实需要给每列设置字段名,使用结构化数组的功能
这种场景下结构化数组本身的形状就是(4,),因为每个元素是包含3个字段的复合类型,不需要强行改成(4,3),它的使用逻辑和原二维数组是完全匹配的:
>>> dtype = [('sum', 'int'), ('cc', 'int'), ('xprob', 'int')] >>> arr_d = np.array(blender, dtype=dtype) >>> # 原写法arr[行索引, 列索引] 等价于 arr_d[字段名][行索引] >>> # 比如取第一行第一个元素 >>> arr[0,0] 1.0 >>> arr_d['sum'][0] 1 >>> # 取第三列所有元素 >>> arr[:,2] array([ 2., -101., 2., -101.]) >>> arr_d['xprob'] array([ 2, -101, 2, -101])
如果强行对结构化数组做reshape得到(4,3)的形状,反而会增加索引复杂度,没有实际使用价值,不推荐这种操作。
内容的提问来源于stack exchange,提问作者camagu4
相关产品推荐
相关产品推荐

