【发布时间】:2018-06-15 10:28:57
【问题描述】:
我有一些(很多)二进制编码向量,例如:
[0, 1, 0, 0, 1, 0] #But with many more elements each one
它们都存储在一个 numpy (2D) 数组中,例如:
[
[0, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 1],
[0, 1, 0, 0, 1, 0],
]
我想得到一个每个标签集的频率表。因此,在本例中,频率表将是:
[2,1]
因为第一个标签集有两个外观,而第二个标签集只有一个。
换句话说,我想从 Scipy 实现 itemfreq 或从 numpy 实现 histogram,但不是针对单个元素,而是针对列表。
现在我实现了以下代码:
def get_label_set_freq_table(labels):
uniques = np.empty_like(labels)
freq_table = np.zeros(shape=labels.shape[0])
equal = False
for idx,row in enumerate(labels):
for lbl_idx,label_set in enumerate(uniques):
if np.array_equal(row,label_set):
equal = True
freq_table[lbl_idx] += 1
break
if not equal:
uniques[idx] = row
freq_table[idx] += 1
equal = False
return freq_table
作为标签二进制编码向量。
效果很好,但是当向量的数量很大(>58.000)并且每个向量中的元素数量也很大(>8.000)时,它会非常低
如何以更有效的方式做到这一点?
【问题讨论】:
-
这对我来说看起来并不热门。
-
你说得对,我会将问题编辑为“二进制”向量。谢谢。 @Divakar 也有同样的赞赏。
标签: python performance numpy scipy