np.array和set的交集

戴维男孩

我想将np.array与集合相交,而不必先将np.array转换为列表(将程序减慢到无法工作的水平)。

这是我当前的代码:(请注意,我是从b,g,r rawCapture获取此数据的,而selection_data只是之前的一组。)

def GreenCalculations(data):
    data.reshape(1,-1,3)
    data={tuple(item) for item in data[0]}
    ColourCount=selection_data & set(data)
    Return ColourCount

现在,我现在的问题是,由于数据[0],我只比较图片的第一部分。是否可以遍历所有行?

注意:tolist()需要很多时间。

hpaulj

首先是一个样品data; 我猜这是一个nxnx3数组,带有dtypeuint8

In [791]: data=np.random.randint(0,256,(8,8,3),dtype=np.uint8)

reshape 方法返回具有新形状的新数组,但不会就地更改它:

In [793]: data.reshape(1,-1,3)

data.shape=(1,-1,3)会就地做到这一点。但是为什么要初始1呢?

反而:

In [795]: aset={tuple(item) for item in data.reshape(-1,3)}
In [796]: aset
Out[796]: 
{(3, 92, 60),
 (5, 211, 227),
 (6, 185, 183),
 (9, 37, 0),
 ....

 In [797]: len(aset)
 Out[797]: 64

就我而言,一组64个唯一项-考虑到我是如何生成这些值的,这不足为奇

您无所事事的data.reshape行,并{tuple(item) for item in data[0]}说明了为什么它似乎只在图片的第一行起作用。

我猜selection_data是类似的3项元组,例如:

In [801]: selection_data = {tuple(data[1,3,:]), (1,2,3), tuple(data[5,5,:])}
In [802]: selection_data
Out[802]: {(1, 2, 3), (49, 132, 26), (76, 131, 16)}
In [803]: selection_data&aset
Out[803]: {(49, 132, 26), (76, 131, 16)}

您没有说要在哪里使用tolist,但我猜测是在生成元组的过程中。

但奇怪的是,tolist可以加快转换速度:

In [808]: timeit {tuple(item) for item in data.reshape(-1,3).tolist()}
10000 loops, best of 3: 57.7 µs per loop
In [809]: timeit {tuple(item) for item in data.reshape(-1,3)}
1000 loops, best of 3: 239 µs per loop
In [815]: timeit data.reshape(-1,3).tolist()
100000 loops, best of 3: 19.8 µs per loop
In [817]: timeit {tuple(item.tolist()) for item in data.reshape(-1,3)}
10000 loops, best of 3: 100 µs per loop

因此,为了执行这种列表和设置操作,我们不妨立即跳到列表格式。

numpy具有一些设置功能,例如np.in1d这仅对1d数组进行操作,但是正如某些unique row问题所证明的那样,我们可以通过将2d数组视为结构化数组来解决这一问题。我必须四处弄弄才能做到这一点:

In [880]: dt=np.dtype('uint8,uint8,uint8')
In [881]: data1=data.reshape(-1,3).view(dt).ravel()
In [882]: data1
Out[882]: 
array([(41, 145, 254), (138, 144, 7), (192, 241, 203), (42, 177, 215),
       (78, 132, 87), (221, 176, 87), (107, 171, 147), (231, 13, 53),
       ... 
      dtype=[('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1')])

构造具有相同结构化数组性质的选择:

In [883]: selection=[data[1,3,:],[1,2,3],data[5,5,:]]
In [885]: selection=np.array(selection,np.uint8).view(dt)
In [886]: selection
Out[886]: 
array([[(49, 132, 26)],
       [(1, 2, 3)],
       [(76, 131, 16)]], 
      dtype=[('f0', 'u1'), ('f1', 'u1'), ('f2', 'u1')])

因此,在项目selection是中还发现data1有:

In [888]: np.in1d(selection,data1)
Out[888]: array([ True, False,  True], dtype=bool)

data1选中的项目是:

In [890]: np.where(np.in1d(data1,selection))
Out[890]: (array([11, 45], dtype=int32),)

或呈散开的形状

In [891]: np.where(np.in1d(data1,selection).reshape(8,8))
Out[891]: (array([1, 5], dtype=int32), array([3, 5], dtype=int32))

与我用来生成的(1,3)和(5,5)相同selection

in1d时序为竞争力:

In [892]: %%timeit
     ...: data1=data.reshape(-1,3).view(dt).ravel()
     ...: np.in1d(data1,selection)
     ...: 
10000 loops, best of 3: 65.7 µs per loop

In [894]: timeit selection_data&{tuple(item) for item in data.reshape(-1,3).tolist()}
10000 loops, best of 3: 91.5 µs per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

np.array的np.array的深层副本

来自分类Dev

函数的结果-np.array

来自分类Dev

访问 np.array 的部分

来自分类Dev

解释散点图的np.polyfit和np.polyval

来自分类Dev

numpy:np.repeat和np.broadcast_to之间的区别

来自分类Dev

选择值np.nonzero()和〜np.isnan()的索引

来自分类Dev

解释散点图的np.polyfit和np.polyval

来自分类Dev

np.concatenate 和 np.hstack 的区别

来自分类Dev

np.nan 和 np.NaN 的区别

来自分类Dev

cython中的np.int,np.int_,int和np.int_t之间的区别?

来自分类Dev

np.random.seed(int)和np.random.seed(array_like)之间的区别?

来自分类Dev

NP完整性和硬度分类

来自分类Dev

np转置和压缩无效

来自分类Dev

python函数和np.vectorize问题

来自分类Dev

Matlab wrapToPi 和 python np.unwrap

来自分类Dev

如何从np.array(2.7)获取2.7?

来自分类Dev

Python:快速遍历np.array

来自分类Dev

NumPy:按np.array过滤行

来自分类Dev

为np.array分配较大的值

来自分类Dev

Python将np.array变成列表

来自分类Dev

在np.array中使用颜色

来自分类Dev

在ctypes结构中访问np.array

来自分类Dev

删除np.array中的选定行

来自分类Dev

按维度扩展 np.array()

来自分类Dev

numpy `np.array()[None]` 行为

来自分类Dev

为什么np.array上的astype(uint)不会更改np.array元素的类型?

来自分类Dev

根据另一个 np.array python 的值设置 np.array 的值

来自分类常见问题

np.random.seed()和np.random.RandomState()之间的区别

来自分类Dev

np.uint8和np.int8的执行时间不同