我有一个形状(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]