gpt4 book ai didi

python - 如何查找二维数组的按列唯一元素及其频率

转载 作者:行者123 更新时间:2023-12-01 00:14:23 26 4
gpt4 key购买 nike

目前,我正在使用 pandas 查找二维数组的按列唯一元素及其频率:

#Dummy array 
arr = [[0,-1,0,0,0,1,0],[1,0,0,0,0,-1,0],[0,0,0,0,0,0,-1]]

#Convert to pandas
pd_arr = pd.DataFrame(arr)

#Apply value_counts on each column
val_counts = pd_arr.apply(pd.value_counts)

这会产生数据框:

example_result

这正是我想要的 - 在这里,索引表示唯一值,并且表中填充了这些值在虚拟数组内 7 列中每一列中的频率。

实际上,arr 是 40x8 并且包含 -1、1 和 0 值 - 这并不大,但位于数十万个循环内。整个循环花费的时间太长,因此我正在为每个部分寻找更快的方法。

经过很长时间的搜索,我似乎找不到一种不使用 pandas 的方法来做到这一点。使用 numpy 数组而不是转换为 pandas 寻找解决方案可能是理想的选择,因为直接使用 numpy 会使循环的其他部分更快,并且 pandas 和 numpy 之间的切换听起来也不是很干净整洁。不过,我也愿意接受更快的 pandas 选择!

我尝试使用 np.unique 等解决方案来解决 arr np.unique(arr)

然而,这以及我在操纵它方面的不成功尝试,只是给出了唯一值array([-1, 0, 1])和整个数组的总频率,没有灵 active 跨轴执行此操作,如上面的示例输出所示。

似乎没有太多其他方法可以解决这个特定问题,但是如果我错了,请指导我!

实际上,arr 是 40x8 并且包含 -1、1 和 0 值 - 我知道这并不大,但它位于数十万个循环内,因此所花费的时间会增加!

我很想听听您关于如何找到这些独特值及其计数的建议!我可以使用的模块不受限制。谢谢:)

最佳答案

利用只有三个值 -1,0,1 的优势,您可以使用以下代码,在我相当普通的笔记本电脑上,对于 40x8 数组,该代码需要 23 us(比 pandas 方法加速 > 500 倍):

def count_it(a):
total = a.shape[0]
non_0 = np.count_nonzero(a,axis=0)
delta = a.sum(0)
return np.array([(non_0-delta)>>1,total-non_0,(non_0+delta)>>1])

这将返回实际计数,如果您希望 nan 指示计数为 0,则必须将 0 替换为 nan。

示例:

a = np.random.randint(-1,2,(40,8)) 

count_it(a)
# array([[12, 12, 8, 12, 14, 12, 16, 12],
# [15, 11, 20, 17, 11, 11, 11, 14],
# [13, 17, 12, 11, 15, 17, 13, 14]])

# check against pandas:
np.all(pd.DataFrame(a).apply(pd.value_counts) == count_it(a))
# True

它是如何工作的:

让我们考虑单个列 C,并令 m,z,p 为 -1、0 和 1 的计数。然后

  1. m+z+p = len(C)
  2. m+p = np.count_nonzero(C)
  3. p-m = C.sum()

我们可以——而且代码也可以——解决 m、z 和 p 的问题。

关于python - 如何查找二维数组的按列唯一元素及其频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59419081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com