您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – vectorize numpy独特的子阵列

5b51 2022/1/14 8:23:35 python 字数 3258 阅读 604 来源 www.jb51.cc/python

我有一个形状(N,20,20)的numpy数组数据,N是一些非常大的数字.我想获得每个20x20子阵列中唯一值的数量.循环将是:values = [] for i in data: values.append(len(np.unique(i))) 我怎么能对这个循环进行矢量化?速度是一个问题.如果我尝试np.unique(数据),我得到整个数据数组的

概述

我有一个形状(N,20,20)的numpy数组数据,N是一些非常大的数字.
我想获得每个20×20子阵列中唯一值的数量.
循环将是:

values = []
for i in data:
    values.append(len(np.unique(i)))

我怎么能对这个循环进行矢量化?速度是一个问题.

如果我尝试np.unique(数据),我得到整个数据数组的唯一值,而不是单独的20×20块,所以这不是我需要的.

获取每行唯一值的简单方法是将每一行转储到一个集合中并让它进行排序:

[len(set(i)) for i in data.reshape(data.shape[0],-1)]

但这是一个迭代,可能是一个快速的迭代.

“向量化”的一个问题是每行中唯一值的集合或列表的长度不同. “矢量化”时,“具有不同长度的行”是一个红色标记.您不再具有“矩形”数据布局,使大多数矢量化成为可能.

你可以排序每一行:

np.sort(data.reshape(N,-1))

array([[1,2,3,5,6,6],[1,1,7],[0,4,9],[2,7,8,9]])

但是,如何在不迭代的情况下识别每行中的唯一值?计算非零差异的数量可能只是诀窍:

In [530]: data=np.random.randint(10,size=(5,10))

In [531]: [len(set(i)) for i in data.reshape(data.shape[0],-1)]
Out[531]: [7,6]

In [532]: sdata=np.sort(data,axis=1)
In [533]: (np.diff(sdata)>0).sum(axis=1)+1            
Out[533]: array([7,6])

我打算添加一个关于浮点数的警告,但是如果np.unique对你的数据起作用,我的方法应该也能正常工作.

[(np.bincount(i)>0).sum() for i in data]

这是一个迭代解决方案,明显比我的len(set(i))版本快,并且与diff … sort竞争.

在[585]中:data.shape
出[585]

总结

以上是编程之家为你收集整理的python – vectorize numpy独特的子阵列全部内容,希望文章能够帮你解决python – vectorize numpy独特的子阵列所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶