但对于数组索引

2024-04-19 18:48:19 发布

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

我正在寻找一个整洁的表示方法来创建一个用于数组索引的掩码,我有两个向量,一个表示我感兴趣的数据,另一个包含数据本身。我试着让它工作如下:

dataINeed = np.arange(3)

-array([0,1,2])

data = random.randint(10,size = (10)) 

-array([5,7,9,1,5,3,7,1,2,0])

mask = data in dataINeed

- array([False,False,False,True,False,False,False,True,True,True])

我知道这可能是可以实现的使用集运算,但我无法找出接收得到这样的结果。有什么帮助吗?你知道吗


Tags: 数据方法falsetruedatanprandom数组
2条回答

Roman Susi's solution非常快(与我提出的想法相比)。你知道吗

以下是针对这些其他方法的一些基准:

使用此设置:

import numpy as np

N = 10000
m = 3000
dataINeed = np.arange(m)
data = np.random.randint(N,size = (N))

In [76]: %timeit dataINeedset = set(dataINeed); np.fromiter((x in dataINeedset for x in data),dtype = bool, count = -1)
100 loops, best of 3: 4.46 ms per loop

In [61]: %timeit ~np.prod(np.subtract.outer(data,dataINeed).astype('bool'),axis=-1,dtype='bool')
1 loops, best of 3: 335 ms per loop (Roman's solution is 75x faster than mine!)

In [54]: %timeit np.logical_or.reduce([(data == x) for x in dataINeed])
1 loops, best of 3: 1.72 s per loop  (Roman's solution is 386x faster)

这样好吗?你知道吗

>>> import numpy as np
>>> dataINeed = np.arange(3)
>>> dataINeed
array([0, 1, 2])
>>> data = np.array([5,7,9,1,5,3,7,1,2,0])
>>> dataINeedset = set(dataINeed)
>>> np.array([x in dataINeedset for x in data])
array([False, False, False,  True, False, False, False,  True,  True,  True], dtype=bool)

相关问题 更多 >