python – vectorize numpy独特的子阵列

我有一个形状(N,20,20)的numpy数组数据,N是一些非常大的数字.我想获得每个20×20子阵列中唯一值的数量.循环将是: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块,所以这不是我需要的.

最佳答案
首先,您可以使用data.reshape(N,-1),因为您有兴趣对最后2个维度进行排序.

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

[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]

作者: dawei

【声明】:永州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部