用于绝对值的Python numpy布尔掩码
假设您有一个numpy数组(n,n)用于绝对值的Python numpy布尔掩码,python,arrays,numpy,indexing,masking,Python,Arrays,Numpy,Indexing,Masking,假设您有一个numpy数组(n,n) 用-5到5之间的随机整数填充x。是否有一种方法可以使用布尔掩码,使我所有的0值变为1,所有的非零数字变为0?(即,如果[index]>0或[index],您可以使用列表理解来实现此功能 bool_x=[0如果y!=0,则x中的y为1。重塑(25,1)] 如果你要加快速度,尽管考虑是否真的需要数组为5x5,然后转换,或者如果你可以 NP.A朗格(25),直接应用列表理解,然后进行重塑。所有这些重塑都会让你付出一定的代价。首先,你不需要使用重塑,你可以像这样直接
用-5到5之间的随机整数填充x。是否有一种方法可以使用布尔掩码,使我所有的0值变为1,所有的非零数字变为0?(即,如果[index]>0或[index],您可以使用列表理解来实现此功能
bool_x=[0如果y!=0,则x中的y为1。重塑(25,1)]
如果你要加快速度,尽管考虑是否真的需要数组为5x5,然后转换,或者如果你可以<代码> NP.A朗格(25),直接应用列表理解,然后进行重塑。所有这些重塑都会让你付出一定的代价。
首先,你不需要使用重塑,你可以像这样直接创建你的随机矩阵:M = np.random.randint(-5,5,(2,2))
M[M==1]=10
M[M==0]=1
M[M==10]=0
然后,如果你想进行替换,你可以这样做你的索引:
M = np.random.randint(-5,5,(2,2))
M[M==1]=10
M[M==0]=1
M[M==10]=0
首先,您可以使用以下命令直接实例化阵列: 要真正完成任务,可能需要输入cast To bool,输入cast back,然后否定
res = 1 - x.astype(bool).astype(int)
或者,您可以更明确一点:
x[x != 0] = 1
res = 1 - x
但第二种方法似乎需要两倍多的时间:
>>> n = 1000
>>> a = np.random.randint(-5, 6, (n, n))
>>> %timeit a.astype(bool).astype(int)
1000 loops, best of 3: 1.58 ms per loop
>>> %timeit a[a != 0] = 1
100 loops, best of 3: 4.61 ms per loop
您可以使用与
0
的简单比较为我们提供一个布尔数组,然后使用+0
转换为int
数据类型,或者使用.astype(int)
进行类型转换。因此,我们有两种方法
方法#1:
(x==0)+0
(x==0).astype(int)
方法#2:
(x==0)+0
(x==0).astype(int)
运行时测试
本节比较前面提到的两种方法的运行时,并包括
将x
转换为布尔数据类型的-
案例1:
案例2:
似乎
(x==0)。aType(int)
执行得很好!谢谢,这个方法按照我希望的方式工作。