Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更好的方法来计算SArray值?_Python_List_Counter_Graphlab - Fatal编程技术网

Python 有没有更好的方法来计算SArray值?

Python 有没有更好的方法来计算SArray值?,python,list,counter,graphlab,Python,List,Counter,Graphlab,我正在寻找一种比下面描述的更好的方法来计算数组值(Graphlab使用Python创建) 谢谢你的指点和建议。 经过额外的实验,len(labels[labels==])似乎做得更好(对于我的要求,期望的数字范围很小),仅供其他人参考。我提供了我用来衡量三种方法的代码。如果你知道其他更好的方法,请告诉我 import numpy as np from random import randint from collections import Counter for data_set_size

我正在寻找一种比下面描述的更好的方法来计算数组值(Graphlab使用Python创建)

谢谢你的指点和建议。 经过额外的实验,len(labels[labels==])似乎做得更好(对于我的要求,期望的数字范围很小),仅供其他人参考。我提供了我用来衡量三种方法的代码。如果你知道其他更好的方法,请告诉我

import numpy as np
from random import randint
from collections import Counter

for data_set_size in [10, 100, 1000, 10000, 100000, 1000000]:
    labels = graphlab.SArray([randint(-1,1) for p in range(0, data_set_size)])
    print "Data set size: ", data_set_size

    %timeit -n 100 l = list(labels); l.count(-1), l.count(0), l.count(1)
    %timeit -n 100 len(labels[labels == -1]), len(labels[labels == 0]), len(labels[labels == 1])
    %timeit -n 100 label_count = Counter(labels); label_count.get(-1), label_count.get(0), label_count.get(1)

您可以使用集合中的计数器

labels = [-1, -1, 1, 1, 1]
from collections import Counter
label_count = Counter(labels)
label_count.get(1)
三,

[(1,3),(-1,2)]


参考链接:

您可以使用我使用的这个简单的hack

plus_one_count = labels.where(labels == 1, 1, 0).sum()

#plus_one_count = graphlab.SArray.where(labels == 1, 1, 0).sum()

minu_ones_count = labels.where(labels == -1, 1, 0).sum()
它只是返回一个SArray,条件为真,否则为零,然后求和

您可以找到这方面的文档

希望这能解决您的问题。

来源

labels = graphlab.SArray([-1, -1, 1, 1, 1])
print (labels == -1).nnz()
print (labels == 1).nnz()
输出

2
3
链接


如果数组中只有两个值,则无需再次计数。谢谢。代码片段被简化了。实际案例将包含数千个具有任何整数值的数据。谢谢Vikash-但我正在寻找一种使用SArray数据类型Graphlab的更好方法。不知何故,从他们的API文档中我看不太清楚。@SaravananChidambaram我认为SArray没有计数器功能。Vikash:我做了一些额外的实验,比较了3种方法[1]将SArray转换为list()并使用count()[2]使用像len(labels[labels=-1])这样的访问,这似乎是很少有人按照您的建议使用[3]的计数器。我将数组值限制为{-1,0,1},数组大小从10个数字到100万个数字不等。您可能有兴趣知道,随着大小的增加,方法#2的性能优于这三种方法。但是,我没有尝试过任何整数值,而是像这里的例子那样限制为3个值。方法2可能有更好的性能,因为您只计算了1个数字。其中,方法3对列表中的所有唯一值进行计数。但我同意你的看法。只是在我不得不优化之前,我不会这么做。百万分之二秒或十秒都没有区别。只有当它达到指数级的时间,比如几分钟或几天,我才开始优化。个人风格。过早的优化不是我的风格。这两者都不会使优化代码复杂化。仅陈述我的观点:)
labels = graphlab.SArray([-1, -1, 1, 1, 1])
print (labels == -1).nnz()
print (labels == 1).nnz()
2
3