我正在使用matplotlib来绘制数据.这是一个类似的代码:
import matplotlib.pyplot as plt
f, ax = plt.subplots(1)
xdata = [1, 4, 8]
ydata = [10, 20, 30]
ax.plot(xdata, ydata)
plt.show(f)
Run Code Online (Sandbox Code Playgroud)
这显示了y轴从10到30的图形中的线.虽然我对x范围感到满意,但我想将y范围从0开始更改并调整ymax以显示所有内容.
我目前的解决方案是:
ax.set_ylim(0, max(ydata))
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有办法说:autoscale但是从0开始.
每个人都知道,或者至少每个程序员都应该知道,使用该float
类型可能会导致精确错误.但是,在某些情况下,确切的解决方案会很好,并且有些情况下使用epsilon值进行比较是不够的.无论如何,这不是重点.
我知道Decimal
Python中的类型,但从未尝试过使用它.它声明"十进制数字可以准确表示",我认为这意味着一个聪明的实现,允许表示任何实数.我的第一次尝试是:
>>> from decimal import Decimal
>>> d = Decimal(1) / Decimal(3)
>>> d3 = d * Decimal(3)
>>> d3 < Decimal(1)
True
Run Code Online (Sandbox Code Playgroud)
非常失望,我回到文档并继续阅读:
算术的上下文是指定精度的环境[...]
好的,所以实际上有一个精度.经典问题可以复制:
>>> dd = d * 10**20
>>> dd
Decimal('33333333333333333333.33333333')
>>> for i in range(10000):
... dd += 1 / Decimal(10**10)
>>> dd
Decimal('33333333333333333333.33333333')
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:有没有办法让Decimal类型具有无限精度?如果不是,那么比较2个十进制数的更优雅的方法是什么(例如,如果delta小于精度,则d3 <1应该返回False).
目前,当我只进行分割和乘法时,我使用的Fraction
类型:
>>> from fractions import Fraction
>>> f = Fraction(1) / Fraction(3)
>>> f
Fraction(1, 3) …
Run Code Online (Sandbox Code Playgroud) 在C中,字符串是char(char *
)数组,字符通常存储在其中char
.我注意到libC中的一些函数将作为参数整数而不是char.
例如,让我们的职能toupper()
和tolower()
两个使用int
.手册页说:
如果c不是无符号字符值或EOF,则这些函数的行为是未定义的.
我的猜测是,有一个int
,toupper
并且tolower
能够处理unsigned char
和EOF
.但实际上EOF
是在实践中(有没有关于它的值的规则?)一个可以用a存储的值char
,并且由于这些函数不会转换EOF
成其他东西,我想知道为什么toupper
不简单地将char作为参数.
在任何情况下,为什么我们需要接受不是字符的东西(例如EOF)?有人能为我提供相关的用例吗?
这与fputc
或类似putchar
,也可以将int
其转换为unsigned char
无论如何.
我正在寻找这种选择的确切动机.我想说服,我不想回答,我不知道有一天有人问我.
我需要为很多不同的N值(1到10000之间)计算Q ^ N,而Numpy有点太慢了.
我已经在math.stackexchange.com上询问是否可以避免为我的特定需求计算Q ^ N而且有人回答我计算Q ^ N应该使用该P D^N P^-1
方法非常快.
所以基本上,而不是做:
import numpy as np
from numpy import linalg as LA
...
LA.matrix_power(m, N)
Run Code Online (Sandbox Code Playgroud)
我试过了 :
diag, P = LA.eig(m)
DN = np.diag(diag**N)
P1 = LA.inv(P)
P*DN*P1
Run Code Online (Sandbox Code Playgroud)
我获得了与结果相同的矩阵(试过一个例子)
在更复杂的矩阵上,Q:
% timeit.Timer('Q**10000', setup=setup).repeat(2, 100)
[5.87254786491394, 5.863131046295166]
% timeit.Timer('diag, P = linalg.eig(Q); DN=np.diag(diag**10000);P1=linalg.inv(P); P*DN*P1', setup=setup).repeat(2, 100)
[2.0032401084899902, 2.018735885620117]
Run Code Online (Sandbox Code Playgroud)
关于我的初始问题,第二种方法允许我P, diag and P1
只计算一次并使用它数千次.使用此方法的速度提高了8倍.
我的问题是:
我正在使用Cachegrind,Callgrind和Gem5进行一些实验.我注意到一些访问被计为cachegrind的读取,如callgrind的写入以及gem5的读取和写入.
我们来看一个非常简单的例子:
int main() {
int i, l;
for (i = 0; i < 1000; i++) {
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
l++;
... (100 times)
}
}
Run Code Online (Sandbox Code Playgroud)
我编译:
gcc ex.c --static -o ex
所以基本上,根据asm文件,addl $1, -8(%rbp)
执行100,000次.由于它既是读取也是写入,我期待100k读取和100k写入.但是,cachegrind只将它们计为read,而callgrind只计为write.
% valgrind --tool=cachegrind --I1=512,8,64 --D1=512,8,64
--L2=16384,8,64 ./ex
==15356== Cachegrind, a cache and branch-prediction profiler
==15356== Copyright (C) 2002-2012, and GNU GPL'd, by Nicholas Nethercote et al.
==15356== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info …
Run Code Online (Sandbox Code Playgroud) 假设我有一系列r
维度(n, m)
.我想改组那个数组的列.
如果我使用numpy.random.shuffle(r)
它洗牌线.我怎么才能洗牌?因此,第一列成为第二列,第三列成为第一列,等等.
例:
输入:
array([[ 1, 20, 100],
[ 2, 31, 401],
[ 8, 11, 108]])
Run Code Online (Sandbox Code Playgroud)
输出:
array([[ 20, 1, 100],
[ 31, 2, 401],
[ 11, 8, 108]])
Run Code Online (Sandbox Code Playgroud) 我有这门课:
class MetricInt(int):
"""Int wrapper that adds only during the observation window."""
def __new__(cls, _, initial):
return int.__new__(cls, initial)
def __init__(self, sim, initial):
int.__init__(initial)
self.sim = sim
def __add__(self, val):
if self.sim.in_observe_window():
self = MetricInt(self.sim, super(MetricInt, self).__add__(int(val)))
return self
Run Code Online (Sandbox Code Playgroud)
其中基本上覆盖了__add__
方法,以便只self.sim.in_observe_window()
返回if True
.
但是,如果初始值太大,我有OverflowError: Python int too large to convert to C long
.
做我正在做的事情并处理大数字的正确方法是什么?
给定以下 Python 程序:
import sys
print("input")
while True:
pass
Run Code Online (Sandbox Code Playgroud)
和 C 中的等价物:
#include <stdio.h>
int main() {
printf("input\n");
while(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用管道cat
传输程序时,默认情况下输出是缓冲的(而不是行缓冲的)。结果,我没有输出:
% python3 ./a.py | cat
(empty)
% ./a.out | cat
(empty)
Run Code Online (Sandbox Code Playgroud)
我可以stdbuf
用来切换回行缓冲:
% stdbuf -oL ./a.out | cat
input
Run Code Online (Sandbox Code Playgroud)
但这不适用于 Python:
% stdbuf -oL python3 a.py | cat
(empty)
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?我知道存在python3 -u
但我想要行缓冲,而不是“无缓冲”,我希望这个命令行也适用于其他语言。该命令unbuffer
似乎也有效,但我想了解为什么stdbuf
在这里不起作用。
我正在使用QEMU和GDB开发一个操作系统(作为一种爱好),但我现在面临一些性能问题.因此,我想知道应该优化哪些功能.
所以基本上,我的需求主要是知道:
你知道我怎么做的吗?我也会接受使用Bochs的解决方案.
我在Linux上使用Swift 2.2,我需要在标准错误流上编写一些调试输出.
目前,我正在做以下事情:
import Foundation
public struct StderrOutputStream: OutputStreamType {
public mutating func write(string: String) { fputs(string, stderr) }
}
public var errStream = StderrOutputStream()
debugPrint("Debug messages...", toStream: &errStream)
Run Code Online (Sandbox Code Playgroud)
但是,我已将Swift升级到2.2.1,但似乎Foundation
已不再可用.
如何使用Swift 2.2.1在标准错误流上编写(并且仍然可以在下一次升级时使用)?