Python numpy将0更改为1,而不将False更改为1

2024-06-11 06:22:28 发布

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

我有一个numpy数组,它的值从布尔值到十进制数和实数不等。我从一个数据库中得到这个数据,这意味着当一个字段丢失时,它返回一个0。我想把所有的0都改成-1,所有的假都改成0,真的改成1。然而,Python似乎无法区分False和0,因此将两者都改为1。这就是我所尝试的:

X[X==0] = -1
X[X==False] = 0
X[X==True] =1

结果是所有的0和所有的错误都改为-1。我该怎么解决这个问题?在

编辑: 这是我的数组示例:

^{pr2}$

我希望所有0.0值都是-1,所有假值都是0,所有真值都是1。在

编辑2:循环所有值都有效,但必须有一个更优雅的解决方案

for i in xrange(X.shape[0]):
    for j in xrange(X.shape[1]):
        if X[i,j] == 0.0 and type(X[i, j]) == float:
            X[i][j] = -1

Tags: 数据innumpy数据库falsetrue编辑示例
1条回答
网友
1楼 · 发布于 2024-06-11 06:22:28

如果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 -> -10 -> -1False -> 0True -> 1other -> other

def zeroswap(elem):
    if type(elem) is bool:
        return int(elem)
    elif elem==0:
        return -1
    else:
        return elem

您可以尝试将此函数调用到不同的元素,以确保它执行预期的操作。底线是您应该map该函数覆盖数组的展开版本,这样您就可以在不必知道数组维数的情况下进行操作。在

相关问题 更多 >