小编Max*_*amy的帖子

使用matplotlib将y范围更改为从0开始

我正在使用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开始.

python matplotlib

39
推荐指数
3
解决办法
6万
查看次数

澄清Python中的Decimal类型

每个人都知道,或者至少每个程序员都应该知道,使用该float类型可能会导致精确错误.但是,在某些情况下,确切的解决方案会很好,并且有些情况下使用epsilon值进行比较是不够的.无论如何,这不是重点.

我知道DecimalPython中的类型,但从未尝试过使用它.它声明"十进制数字可以准确表示",我认为这意味着一个聪明的实现,允许表示任何实数.我的第一次尝试是:

>>> 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)

python floating-point decimal python-3.x

35
推荐指数
2
解决办法
3万
查看次数

为什么putchar,toupper,tolower等采用int而不是char?

在C中,字符串是char(char *)数组,字符通常存储在其中char.我注意到libC中的一些函数将作为参数整数而不是char.

例如,让我们的职能toupper()tolower()两个使用int.手册页说:

如果c不是无符号字符值或EOF,则这些函数的行为是未定义的.

我的猜测是,有一个int,toupper并且tolower能够处理unsigned charEOF.但实际上EOF是在实践中(有没有关于它的值的规则?)一个可以用a存储的值char,并且由于这些函数不会转换EOF成其他东西,我想知道为什么toupper不简单地将char作为参数.

在任何情况下,为什么我们需要接受不是字符的东西(例如EOF)?有人能为我提供相关的用例吗?

这与fputc或类似putchar,也可以将int其转换为unsigned char无论如何.

我正在寻找这种选择的确切动机.我想说服,我不想回答,我不知道有一天有人问我.

c putchar toupper tolower

15
推荐指数
1
解决办法
2279
查看次数

比numpy更快的矩阵功率?

我需要为很多不同的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倍.

我的问题是:

  • 在这种情况下,不可能使用这最后一种方法来计算Q ^ N?
  • 在我的情况下使用它是否可以(这里给出的矩阵Q )?
  • numpy中是否有一个已经完成的功能? …

python numpy matrix

15
推荐指数
1
解决办法
3283
查看次数

使用cachegrind和callgrind进行不同的读写计数

我正在使用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)

c assembly callgrind cachegrind gem5

14
推荐指数
1
解决办法
1155
查看次数

用Numpy洗牌阵列

假设我有一系列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)

python arrays numpy

14
推荐指数
3
解决办法
2万
查看次数

OverflowError:Python int太大而无法转换为C long

我有这门课:

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

9
推荐指数
2
解决办法
2万
查看次数

为什么 stdbuf 对 Python 没有影响?

给定以下 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在这里不起作用。

c python linux buffer pipe

7
推荐指数
1
解决办法
1107
查看次数

如何用QEMU进行分析?

我正在使用QEMU和GDB开发一个操作系统(作为一种爱好),但我现在面临一些性能问题.因此,我想知道应该优化哪些功能.

所以基本上,我的需求主要是知道:

  • 我的内核在哪些函数中花费的时间最多.
  • 调用函数的次数

你知道我怎么做的吗?我也会接受使用Bochs的解决方案.

performance profiling qemu osdev

5
推荐指数
1
解决办法
2128
查看次数

如何使用Swift在stderr上打印?

我在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在标准错误流上编写(并且仍然可以在下一次升级时使用)?

linux swift swift2

5
推荐指数
1
解决办法
1443
查看次数