Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于绝对值的Python numpy布尔掩码_Python_Arrays_Numpy_Indexing_Masking - Fatal编程技术网

用于绝对值的Python numpy布尔掩码

用于绝对值的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),直接应用列表理解,然后进行重塑。所有这些重塑都会让你付出一定的代价。首先,你不需要使用重塑,你可以像这样直接

假设您有一个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),直接应用列表理解,然后进行重塑。所有这些重塑都会让你付出一定的代价。

首先,你不需要使用重塑,你可以像这样直接创建你的随机矩阵:

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)
执行得很好!

谢谢,这个方法按照我希望的方式工作。