如果Numpy数组是同构的,或者至少当它们有一个与之相关联的固定类型模式时,Numpy数组是最有效的。您只能将ragtag值集合保存在dtype=object的numpy数组中,这可能是使用numpy所能做的效率最低的事情。在
相应地,没有高效的(我所知道的)方法允许您访问每个元素的类型。这并不是在使用numpy时经常出现的问题。在
所以我能想到的使代码更优雅的唯一方法就是将双循环转换为函数调用。我将使用map,这可能仍然不如本机numpy函数快(因为后者是用C编译的),但它可能比python的双循环更快,也更清晰。在
不过,有一点我也在评论中提到:你的示例数据不是矩形的,也就是说,不管你怎么努力,它都不能转换成2d numpy数组。我假设您在组装MCVE时犯了一个错误,并从示例数据的第四行中省略了一个元素(从而使您的数组(4,7)形状)。在import numpy as np
# dummy data as nested list, make sure it's rectangular
datlist = [[0.03829744, 0.0, True, False, True, True, 6.0],
[0.0, 0.0, True, False, True, True, 6.0],
[0.09174341, 0.0, True, False, True, True, 6.0],
[0.03489284, 0, True, True, False, 0, 6.0]] #dropped an element here
# create a numpy array of dtype object from datlist
dat = np.array(datlist,dtype=object)
我从你的例子中得知这是你的出发点。现在,我要做的是定义一个函数来检查数组元素的值和类型,对于非bool零返回-1。然后可以将此函数map添加到数组中,使用.ravel()访问整个数据范围:
^{pr2}$
生成的数组如下所示:array([[0.03829744, -1, True, False, True, True, 6.0],
[-1, -1, True, False, True, True, 6.0],
[0.09174341, -1, True, False, True, True, 6.0],
[0.03489284, -1, True, True, False, -1, 6.0]], dtype=object)
如您所见,float和integer的0都被转换为-1。这对我来说是有意义的,这是因为我们只检查了非False个零。{7}你可以很容易地分辨出这两种。如果要切换bool值,也可以这样做。下面是一个升级的函数,它将转换0.0 -> -1,0 -> -1,False -> 0,True -> 1,other -> other:def zeroswap(elem):
if type(elem) is bool:
return int(elem)
elif elem==0:
return -1
else:
return elem
您可以尝试将此函数调用到不同的元素,以确保它执行预期的操作。底线是您应该map该函数覆盖数组的展开版本,这样您就可以在不必知道数组维数的情况下进行操作。在