假设我有一个大型2D numpy数组(称之为A),其中包含从0到9的整数。
我正在尝试编写一个函数,该函数返回一个与A形状相同的二进制NumPy数组(称之为B),该数组具有以下特性。
如果A中的对应元素出现在给定列表L中,则B中的条目为1;否则,条目为零。
下面显示了可能不是最有效的代码。
A = np.random.randint(0, 10, (5, 5))
L = [3,4,5]
B = np.zeros(A.shape)
for e in L:
B[A==e] = 1
有更快的路吗?
3条答案
按热度按时间6vl6ewon1#
看来我福尔斯指出一个显而易见的事实
基准:
ttygqcqt2#
这里有两个
numpy
选项,其中np.in1d
是基础python中in
的矢量化版本。当数组很大时,第一个选项显示速度有所提高:2jcobegt3#
使用@Psidom的1000 x1000矩阵,我引入了另外两个方法,包括@Psidom提供的
np.in1d
方法。一个使用迭代求和,另一个使用迭代逐位或。
迭代的按位or,
trial2()
,在下面证明了自己,提供的结果比原始的快4倍,比3d中的numpy快2倍,但是请注意,它提供了一个布尔类型的矩阵结果。当按位方法被修改为返回整数结果
trial2_int()
时,其速度基本上相当于numpy的in1d
。结果: