Python列表转np.ndarray:循环转换未生效的原因及解决方法
问题
需要将多个数组转为np.ndarray类型,用for循环执行转换时,循环内显示已转换,但循环结束后原变量仍为list类型。测试代码及输出如下:
import numpy as np pos = [1,1,1] vel = [1,1,2] # vel = np.array([1,1,2]) accel = [1,1,3] print('\nredefining...') for elem in [pos,vel,accel]: # checks if the array is of the np.ndarray class print(type(elem)) if not isinstance(elem, np.ndarray): elem = np.array(elem) print(type(elem)) print('---------------------------') print('\nafter the redefinition:') print(type(pos)) print(type(vel)) print(type(accel))
输出:
redefining... <class 'list'> <class 'numpy.ndarray'> --------------------------- <class 'list'> <class 'numpy.ndarray'> --------------------------- <class 'list'> <class 'numpy.ndarray'> --------------------------- after the redefinition: <class 'list'> <class 'list'> <class 'list'>
原因
循环中的elem只是原变量的临时引用副本。当执行elem = np.array(elem)时,只是把这个临时变量重新指向了新创建的np.ndarray对象,但并没有修改原变量(pos/vel/accel)本身的指向。原变量依然指向最初的list对象,所以循环结束后类型没变。
修复方法
方法1:通过索引遍历并重新赋值原变量
把变量放进列表,通过索引修改列表元素,最后再把列表元素重新赋值给原变量:
import numpy as np pos = [1,1,1] vel = [1,1,2] accel = [1,1,3] # 把变量存入列表 arrays = [pos, vel, accel] for i in range(len(arrays)): if not isinstance(arrays[i], np.ndarray): arrays[i] = np.array(arrays[i]) # 重新赋值给原变量 pos, vel, accel = arrays print(type(pos)) # <class 'numpy.ndarray'> print(type(vel)) # <class 'numpy.ndarray'> print(type(accel)) # <class 'numpy.ndarray'>
方法2:使用字典管理变量
如果变量较多,用字典更清晰,直接修改字典中的值:
import numpy as np data = { 'pos': [1,1,1], 'vel': [1,1,2], 'accel': [1,1,3] } for key in data: if not isinstance(data[key], np.ndarray): data[key] = np.array(data[key]) # 按需取出变量 pos = data['pos'] vel = data['vel'] accel = data['accel'] print(type(pos)) # <class 'numpy.ndarray'>
方法3:直接逐个转换(简单直接)
如果变量数量不多,直接逐个判断转换反而更直观:
import numpy as np pos = [1,1,1] vel = [1,1,2] accel = [1,1,3] if not isinstance(pos, np.ndarray): pos = np.array(pos) if not isinstance(vel, np.ndarray): vel = np.array(vel) if not isinstance(accel, np.ndarray): accel = np.array(accel) print(type(pos)) # <class 'numpy.ndarray'>
内容的提问来源于stack exchange,提问作者CosmeticMichu
相关产品推荐
相关产品推荐

