我有一个scipy数组,例如
a = array([[0, 0, 1], [1, 1, 1], [1, 1, 1], [1, 0, 1]])
Run Code Online (Sandbox Code Playgroud)
我想计算数组中每个唯一元素的出现次数.例如,对于上面的数组a,我想知道[1次,0次,1次]出现1次,[1,1,1]出现1次,[1,0,1]出现1次.
我想到的一种方法是:
from collections import defaultdict
d = defaultdict(int)
for elt in a:
d[elt] += 1
Run Code Online (Sandbox Code Playgroud)
有更好/更有效的方式吗?
谢谢.
我正在尝试解决Rosalind在给定序列中计算核苷酸的基本问题,并将结果返回到列表中.对于那些不熟悉生物信息学的人来说,它只计算一个字符串中4个不同字符('A','C','G','T')的出现次数.
我希望collections.Counter这是最快的方法(首先是因为他们声称是高性能,第二是因为我看到很多人使用它来解决这个特定的问题).
但令我惊讶的是这种方法最慢!
我比较了三种不同的方法,使用timeit和运行两种类型的实验:
这是我的代码:
import timeit
from collections import Counter
# Method1: using count
def method1(seq):
return [seq.count('A'), seq.count('C'), seq.count('G'), seq.count('T')]
# method 2: using a loop
def method2(seq):
r = [0, 0, 0, 0]
for i in seq:
if i == 'A':
r[0] += 1
elif i == 'C':
r[1] += 1
elif i == 'G':
r[2] += 1
else:
r[3] += 1
return r
# method 3: using Collections.counter …Run Code Online (Sandbox Code Playgroud) 虽然类似的问题已经提出了几次,但我仍然无法在Python中创建类似于matlab ismember函数的函数.特别是,我想在循环中使用这个函数,并在每次迭代中将整个矩阵与另一个矩阵的元素进行比较.在发生相同值的情况下,我想打印1,在任何其他情况下打印0.
假设我有以下矩阵
d = np.reshape(np.array([ 2.25, 1.25, 1.5 , 1. , 0. , 1.25, 1.75, 0. , 1.5 , 0. ]),(1,10))
d_unique = np.unique(d)
Run Code Online (Sandbox Code Playgroud)
然后我有
d_unique
array([ 0. , 1. , 1.25, 1.5 , 1.75, 2.25])
Run Code Online (Sandbox Code Playgroud)
现在我想迭代
J = np.zeros(np.size(d_unique))
for i in xrange(len(d_unique)):
J[i] = np.sum(ismember(d,d_unique[i]))
Run Code Online (Sandbox Code Playgroud)
以便作为输出:
J = [3,1,2,2,1,1]
Run Code Online (Sandbox Code Playgroud)
有人有任何想法吗?提前谢谢了.
例如,对于
a = np.array([[1, 0, 0], [1, 0, 0], [2, 3, 4]])
Run Code Online (Sandbox Code Playgroud)
我想得到
[2, 2, 3]
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有循环或使用的情况下执行此操作np.vectorize?
编辑:实际数据包含1000行,每行100个元素,每个元素的范围从1到365.最终目标是确定具有重复项的行的百分比.这是一个家庭作业问题,我已经解决了(使用for循环),但我只是想知道是否有更好的方法来做numpy.
给定一个数据帧:
df = pd.DataFrame({'a' : [1,1,1,1,1,2,1,2,2,2,2]})
Run Code Online (Sandbox Code Playgroud)
我想用'a'周围的大多数值替换'a'列中的每个值.对于数值数据,我可以这样做:
def majority(window):
freqs = scipy.stats.itemfreq(window)
max_votes = freqs[:,1].argmax()
return freqs[max_votes,0]
df['a'] = pd.rolling_apply(df['a'], 3, majority)
Run Code Online (Sandbox Code Playgroud)
我得到:
In [43]: df
Out[43]:
a
0 NaN
1 NaN
2 1
3 1
4 1
5 1
6 1
7 2
8 2
9 2
10 2
Run Code Online (Sandbox Code Playgroud)
我将不得不处理NaNs,但除此之外,这或多或少是我想要的......除了,我想用非数字列做同样的事情,但是Pandas似乎不支持这个:
In [47]: df['b'] = list('aaaababbbba')
In [49]: df['b'] = pd.rolling_apply(df['b'], 3, majority)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-49-507f45aab92c> in <module>()
----> 1 df['b'] = pd.rolling_apply(df['b'], …Run Code Online (Sandbox Code Playgroud) 我有数据框,想计算名称在两列中出现的次数
data=pd.DataFrame({'TEAM 1':['Mark','Peter','Andy','Tony'],'Team 2':
['Andy','Tony','Jhon','Peter']})
Run Code Online (Sandbox Code Playgroud)
所以名字 Andy 会算作 2,而 Jhon 是 1
预期输出
Mark 1
Andy 2
Tony 2
Jhon 1
Peter 2
Run Code Online (Sandbox Code Playgroud)
我使用了这段代码,但它不起作用
data.groupby('TEAM 1')['Team 2'].count()
Run Code Online (Sandbox Code Playgroud) python ×6
numpy ×3
pandas ×2
collections ×1
count ×1
counter ×1
list ×1
performance ×1
scipy ×1