我正在尝试解决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) 可以使用所谓的初始化列表来初始化数组。
例如:
int my_array[3] = {10, 20, 30};
Run Code Online (Sandbox Code Playgroud)
当我们为数组设置一组初始值时,这非常有用。但是,这种方法一旦声明就无法为数组分配新值。
my_array = {10, 20, 30};
error: assigning to an array from an initializer list
Run Code Online (Sandbox Code Playgroud)
但是,有时我们有一些过程需要将数组初始化为一些初始值(例如,在循环内),因此我认为能够使用初始化列表将值分配给已声明的变量将非常有用。
我的问题是:是否有理由在声明时拥有这种功能,但一旦声明数组就没有?为什么在一种情况下有效,而在另一种情况下无效?
我需要用特定的小数位数来计算浮点数。
所以:
2.1235 with 2 decimals --> 2.12
2.1276 with 2 decimals --> 2.12 (round would give 2.13 wich is not what I need)
Run Code Online (Sandbox Code Playgroud)
该函数np.round
接受一个decimals
参数,但现在看来,功能ceil
和floor
不接受小数位数的和始终与零个小数返回一个数字。
当然我可以乘以数字10^ndecimals
,然后应用地板,最后除以10^ndecimals
new_value = np.floor(old_value * 10**ndecimals) / 10**ndecimals
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有一个内置函数可以做到这一点而无需进行操作。
在 Pycharm 中,如果您在项目内的文件夹中单击鼠标右键,则可以将其标记为sources root
,这样您就可以从该文件夹和子文件夹中导入模块。
但是,这样做只会使您的程序可以在 Pycharm 内部运行,如果我尝试从 Pycharm 外部(例如从控制台)执行,它会抱怨找不到某些模块,这就是我面临的问题。
如果我将某个文件夹标记为源根目录,我的程序运行良好,但我需要了解它的作用,以便即使不使用 Pycharm 也可以配置程序以查找此模块。
我想知道这个选项到底做了什么,以及如何在不使用它的情况下获得相同的行为。
它只是__init__.py
在根文件夹中添加一个文件?它是否在做类似的事情:
import sys
sys.path.insert(0, my_folder)
Run Code Online (Sandbox Code Playgroud) 我正在使用matplotlib来分散绘制点的3D矩阵.我使用以下代码:
import pylab as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
my_data = np.random.rand(6500,3) # toy 3D points
fig = plt.figure()
ax = Axes3D(plt.gcf())
ax.scatter(my_data[:,0],my_data[:,1],my_data[:,2])
plt.show()
Run Code Online (Sandbox Code Playgroud)
它有效,所以它打开一个窗口,我可以看到我的观点.
但是,如果我尝试用鼠标旋转绘图(单击并拖动它),它的旋转速度非常慢.
我认为对于如此缓慢且滞后的旋转,6500点并不是很多,所以我想知道是否有任何预配置要加速它.
注意:我尝试使用Matlab,我可以旋转更大的散点图,没有任何延迟,因此它不是计算机限制.
有人可以运行此代码,看看是否也经历了慢速旋转?
编辑:使用系统监视器我可以看到,当旋转点时,只使用一个CPU,因此matplotlib不会并行化该过程.
我的电脑规格:
运行Ubuntu 16.10
Matlab R2016b带有一个怪物会杀死我们所有人:操作员隐式扩展.
基本上如果你有一个矩阵A和一个向量B,你现在可以做A + B(没有bsxfun
或repmat
).听起来不错吧?
但是,如果您提供列向量和行向量,它也可以工作!!
例:
a = 1:4 % row vector
b = (1:4)' % column vector
% before R2016b:
a + b
Matrix dimensions must agree.
% after R2016b:
a + b
ans =
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
Run Code Online (Sandbox Code Playgroud)
扩展两个向量并给出一个矩阵作为结果!! 这非常糟糕,因为您可能在没有注意到的情况下进行了完全不需要的操作.
所以我的问题是:是否有一种方法可以禁用隐式扩展并回复Matrix dimensions must agree
错误?
将.Mat文件中的数据直接加载到变量中时,它会存储结构而不是变量本身.
例:
myData.mat
包括var1
,var2
,var3
如果我做:
load myData.mat
Run Code Online (Sandbox Code Playgroud)
它将在我的工作区中创建变量var1,var2和var3.好.
如果我将load
返回的内容分配给变量,它会存储一个结构.这是正常的,因为我正在加载几个变量.
foo = load('myData.mat')
foo =
struct with fields:
var1
var2
var3
Run Code Online (Sandbox Code Playgroud)
但是假设我只对我感兴趣var1
并希望直接存储到变量中foo
.
Load有一个选项,只能加载.mat文件中的特定变量,但它仍然存储一个struct
foo = load('myData.mat', 'var1')
foo =
struct with fields:
var1
Run Code Online (Sandbox Code Playgroud)
我希望var1
被直接分配到foo
.
我当然可以这样做:
foo = load('myData.mat', 'var1')
foo = foo.var1;
Run Code Online (Sandbox Code Playgroud)
但它应该是一种在一行中自动执行此操作的方法吗?
给定矩阵,很容易计算最小值的值和索引:
A = rand(10);
[value, index] = min(A(:));
Run Code Online (Sandbox Code Playgroud)
但是我还想恢复第二个最小值(最大值为idem).
我当然可以采用以下两种方法中的任何一种:
将A转换为向量并对其进行排序.
PROS:我可以恢复第二个,第三个...... n最小值
缺点:如果A很大,排序很昂贵
一旦找到A的最小位置,我可以将该值替换为大值(例如:Inf),然后min
再次运行.
PROS:比排序便宜
缺点:我必须修改我的矩阵(并将修改后的值保存在aux变量中).在大型矩阵上重新运行min也很昂贵.
我想知道是否有更好的解决方案:
当计算min
算法时必须跟踪到目前为止找到的最小值,直到新值具有较低的值(然后我们更新该值).相反,如果我们跟踪n
到目前为止发现的最后一个最小值将允许恢复最小值n
.
我可以实现这一点,但我想知道它是否是最好的方法,或者它是否已经实现.
我TextInput
在 react-native 中有一个字段,我设置autofocus
为true
这样它在加载时会自动打开键盘。
我想要的是它以大写字母打开键盘(不仅对于第一个字符,我希望启用大写键,以便在键入时所有字母都为大写)
根据TextInput 文档,我可以指定与keyboardType
道具一起使用的键盘类型。
有几种可用的键盘:默认、电子邮件、数字、电话...
但是他们都没有做我想做的:(
聚焦 TextInput 时,如何强制键盘为大写?
我正在学习C++,显然是一种检查a中是否存在特定键的方法std::map
是使用成员函数count
.
我的第一个问题是:键不应该是唯一的吗?确实检查文档它们是唯一的,因此count将返回0或1.
打电话不是有点违反直觉count
吗?为什么不exist
呢?
对于我来说,计数在一个列表中是有意义的,在该列表中您期望出现一些元素,但如果该方法只允许返回1或0,则对我来说没有意义.
我错过了什么吗?是否有理由将其称为count
或者只是一个糟糕的命名?