我正在尝试计算中每行显示的数字np.array
,例如:
import numpy as np
my_array = np.array([[1, 2, 0, 1, 1, 1],
[1, 2, 0, 1, 1, 1], # duplicate of row 0
[9, 7, 5, 3, 2, 1],
[1, 1, 1, 0, 0, 0],
[1, 2, 0, 1, 1, 1], # duplicate of row 0
[1, 1, 1, 1, 1, 0]])
行[1, 2, 0, 1, 1, 1]
显示3次。
一个简单的天真的解决方案将涉及将我所有的行都转换为元组,然后应用collections.Counter
,如下所示:
from collections import Counter
def row_counter(my_array):
list_of_tups = [tuple(ele) for ele in my_array]
return Counter(list_of_tups)
产生:
In [2]: row_counter(my_array)
Out[2]: Counter({(1, 2, 0, 1, 1, 1): 3, (1, 1, 1, 1, 1, 0): 1, (9, 7, 5, 3, 2, 1): 1, (1, 1, 1, 0, 0, 0): 1})
但是,我担心我的方法的效率。也许有一个提供此功能的内置库。我将此问题标记为,pandas
因为我认为它pandas
可能具有我正在寻找的工具。
您可以使用另一个问题的答案来获得唯一项目的计数。
使用结构化数组的另一种选择是使用一种void类型的视图,该视图将整行连接到单个项目中:
a = np.array([[1, 1, 1, 0, 0, 0],
[0, 1, 1, 1, 0, 0],
[0, 1, 1, 1, 0, 0],
[1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 0]])
b = np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))
_, idx = np.unique(b, return_index=True)
unique_a = a[idx]
>>> unique_a
array([[0, 1, 1, 1, 0, 0],
[1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 0]])
编辑 添加了np.ascontiguousarray以下@seberg的建议。如果数组不是连续的,这会使方法变慢。
编辑 可以通过执行以下操作来稍微加快上述速度,也许是以清楚为代价的:
unique_a = np.unique(b).view(a.dtype).reshape(-1, a.shape[1])
另外,至少在我的系统上,性能方面与lexsort方法相当,甚至更好:
a = np.random.randint(2, size=(10000, 6))
%timeit np.unique(a.view(np.dtype((np.void, a.dtype.itemsize*a.shape[1])))).view(a.dtype).reshape(-1, a.shape[1])
100 loops, best of 3: 3.17 ms per loop
%timeit ind = np.lexsort(a.T); a[np.concatenate(([True],np.any(a[ind[1:]]!=a[ind[:-1]],axis=1)))]
100 loops, best of 3: 5.93 ms per loop
a = np.random.randint(2, size=(10000, 100))
%timeit np.unique(a.view(np.dtype((np.void, a.dtype.itemsize*a.shape[1])))).view(a.dtype).reshape(-1, a.shape[1])
10 loops, best of 3: 29.9 ms per loop
%timeit ind = np.lexsort(a.T); a[np.concatenate(([True],np.any(a[ind[1:]]!=a[ind[:-1]],axis=1)))]
10 loops, best of 3: 116 ms per loop
在numpy 1.9中,有一个return_counts
可选的关键字参数,因此您可以简单地执行以下操作:
>>> my_array
array([[1, 2, 0, 1, 1, 1],
[1, 2, 0, 1, 1, 1],
[9, 7, 5, 3, 2, 1],
[1, 1, 1, 0, 0, 0],
[1, 2, 0, 1, 1, 1],
[1, 1, 1, 1, 1, 0]])
>>> dt = np.dtype((np.void, my_array.dtype.itemsize * my_array.shape[1]))
>>> b = np.ascontiguousarray(my_array).view(dt)
>>> unq, cnt = np.unique(b, return_counts=True)
>>> unq = unq.view(my_array.dtype).reshape(-1, my_array.shape[1])
>>> unq
array([[1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 0],
[1, 2, 0, 1, 1, 1],
[9, 7, 5, 3, 2, 1]])
>>> cnt
array([1, 1, 3, 1])
在早期版本中,您可以按照以下方式进行操作:
>>> unq, _ = np.unique(b, return_inverse=True)
>>> cnt = np.bincount(_)
>>> unq = unq.view(my_array.dtype).reshape(-1, my_array.shape[1])
>>> unq
array([[1, 1, 1, 0, 0, 0],
[1, 1, 1, 1, 1, 0],
[1, 2, 0, 1, 1, 1],
[9, 7, 5, 3, 2, 1]])
>>> cnt
array([1, 1, 3, 1])
我正在尝试获取每分钟出现数据的次数。日期看起来是这样的。第一个数字是一个整数,表示自Unix纪元以来的秒数,我将其转换为ISO 8601时间。第二个数字是双精度的。以“00”结尾的时间代表第0分钟,以“60”结尾的时间代表第1分钟。 代码: 我的输出是这样的: 但我正在寻找类似下面的东西(忽略新的分钟找到的文本) 我如何调整它,以便我跟踪当前分钟并添加到计数器,而不会过早地打印出计数器?
问题内容: 我有一个看起来像这样。 对于此数据帧中的每一行,我想计算C1,C2,C3中每一个的出现次数,并将此信息作为列附加到此数据帧中。例如,第一行具有1 C1、0 C2和0 C3。最终数据帧应如下所示 因此,我创建了一个以C1,C2和C3作为值的系列- 一种最重要的方法是在DataFrame的行和列上循环,然后在该Series上循环,并在计数器匹配时递增计数器。但是,有没有一种方法可以以紧凑的
本文向大家介绍C++计算每个字符出现的次数,包括了C++计算每个字符出现的次数的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++计算每个字符出现的次数的实现代码,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助。
有没有办法用熊猫来计算某个值在每一列中出现的次数? 数据= pd。DataFrame({'userID':['Luis ',' Mike ',' Harvey'],' category1':[True,False,True],' category2': [True,True,False],' category3':[False,False,False]}) 假设我想计算每个类别中“真”布尔值的数量
问题内容: 如果我有英文文章或英文小说,并且想计算每个单词出现多少次,用Java编写的最快算法是什么? 有人说您可以使用Map ()完成此操作,但我想知道如何知道关键字是什么?每篇文章都有不同的词,您如何知道“关键”词,然后在其数量上加上一个? 问题答案: 这个数字“我是”只是一个字
我想计算一下给定句子中出现了多少个单词。我使用的是C编程语言。它不能计算最后一个字。在给定的字符串中,它计算每个单词发生的次数。如果有像这样的句子,那么程序应该算。但在我的情况下,它不算作。而不是计算,然后: 我的代码: