小编lin*_*llo的帖子

在 IPython 中导入时的最佳实践

我正在编写一个 .py 文件,它将在第一个单元中的一些 IPython 会话开始时定期导入,但也将从其他非交互式会话导入,因为它包含可以在非批处理中运行的函数- 交互模式。

它基本上是一个包含许多非常常见的类和函数的模块。

由于我将 IPython 与该--pylab=inline选项一起使用,因此已经导入了 numpy 和 matplotlib 函数,但是当使用简单python mymodule.py的批处理运行时,必须专门导入 numpy 函数。

最后,我在 IPython 会话期间提出了双重导入,这是我不太喜欢的事情。

在这种情况下,最佳做法是什么?两次导入模块不是不好的做法吗?

python module numpy matplotlib ipython

4
推荐指数
1
解决办法
546
查看次数

如何精细控制过剩的内环

我想在过剩程序中控制主循环,我想更好地理解以下回调的执行顺序是什么:

glutDisplayFunc(drawGLScene);
glutIdleFunc(idle);
glutTimerFunc(TIMER_MS, update, 0);
Run Code Online (Sandbox Code Playgroud)

我很难理解这个调用程序中的过多排队.

opengl glut timing callback

3
推荐指数
1
解决办法
384
查看次数

QMessageBox警告黄色感叹号图标

如何显示QMessageBox::warning带有三角形感叹号符号的 a 如下所示?

黄色背景三角形感叹号

我在 中找不到任何选项QMessageBox::warning,我只得到红色圆形符号。

qt warnings qmessagebox

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

Cython和类的构造函数

我有一个Cython使用默认构造函数的问题.

我的C++类节点如下

Node.h

class Node
{
public:
    Node()
    { 
        std::cerr << "calling no arg constructor" << std::endl;
            w=0.0;
        d=0.0;
    }
    Node(double val, double val2);
    {
            std::cerr << "calling 2 args constructor" << std::endl;
        this->w=val;
        this->d=val2;
    }
private:
    double d,w;
}
Run Code Online (Sandbox Code Playgroud)

用Cython包装如下

cdef extern from "Node.h":
    cdef cppclass Node:
        Node() except +
        Node(double val1, double val2) except +
        double d
        double w

cdef class pyNode:
    cdef Node *thisptr      # hold a C++ instance which we're wrapping

    def __cinit__(self):
        self.thisptr = new …
Run Code Online (Sandbox Code Playgroud)

c++ python constructor cython default-constructor

3
推荐指数
1
解决办法
3343
查看次数

在Python中线性化列表的最短方法

我想从列表中使用线性增加的值创建一个列表,其中Python中的值非线性增加.例如

input =[10,10,10,6,6,4,1,1,1,10,10]
Run Code Online (Sandbox Code Playgroud)

应转变为:

output=[0,0,0,1,1,2,3,3,3,0,0]
Run Code Online (Sandbox Code Playgroud)

我的代码使用python字典

def linearize(input):
    """
    Remap a input list containing values in non linear-indices list
    i.e.
    input = [10,10,10,6,6,3,1,1]
    output= [0,0,0,1,1,2,3,3] 
    """
    remap={}
    i=0
    output=[0]*len(input)
    for x in input:
        if x not in remap.keys():
            remap[x]=i
            i=i+1
    for i in range(0,len(input)):
        output[i]=remap[input[i]]
    return output
Run Code Online (Sandbox Code Playgroud)

但我知道这段代码可以更有效率.Numpy是一个选择,有些想法可以更好地以更加pythonic的方式完成这项任务吗?必须在大列表上频繁调用此函数.

python algorithm dictionary list

3
推荐指数
1
解决办法
1368
查看次数

与OpenGL GLSL中的atan(y/x)和atan2(y,x)有什么不同

我在理解glsl中函数atan的结果时遇到了一些问题.文档也缺乏.

例如,我需要将顶点转换为球面坐标,转换球面坐标的半径,然后将其转换回笛卡尔坐标.我在以0为中心的半径为2的二氧化碳球的顶点上使用以下变换.

vec3 to_sphere(vec3 P)
{
    float r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z);
    float theta = atan(P.y,(P.x+1E-18));
    float phi= acos(P.z/r); // in [0,pi]
    return vec3(r,theta, phi);
}

vec3 to_cart(vec3 P)
{
    float r = P.x;
    float theta = P.y;
    float phi = P.z;
    return r * vec3(cos(phi)*sin(theta),sin(phi)*sin(theta),cos(theta);
}

void main()
{
    vec4 V = gl_Vertex.xyz;
    vec3 S = to_sphere(V.xyz);
    S.x += S.y;
    V.xyz = to_cartesian(S);

    gl_Position = gl_ModelViewProjectionMatrix * V;
}
Run Code Online (Sandbox Code Playgroud)

但如果我使用atan(y/x)或者结果会有所不同atan2(y,x).我把小1E-18常数放在一边以避免极点.

为什么会这样?我假设返回的值 …

opengl math glsl atan2 coordinate-transformation

3
推荐指数
1
解决办法
3562
查看次数

通过Python控制台对PythonQt库进行非锁定调用

我的Qt应用程序有一个Qt gui(基本上是一些按钮和一个绘制数据的opengl上下文)。我还添加了利用PythonQt类的脚本功能。这些命令是从PythonQtScriptingConsole内部评估的。

我已经明确创建了包装器类和工厂方法,以通过控制台通过当前python上下文发送C ++调用,但是从控制台内部运行长任务时,gui冻结了,因为(我认为)未处理事件循环。因此,第一个解决方案是使用计时器处理事件循环,但是我认为这既缓慢又有点愚蠢,所以我不喜欢它。一种

有人提示吗?Python Global Interpreter Lock在这里有问题吗?

c++ python qt multithreading

2
推荐指数
1
解决办法
391
查看次数

使用具有不同纹理尺寸的OpenGL glTexture3D来倾斜体积数据

当宽度,高度和深度是不同的值时,我有一个问题是弄清楚如何正确使用glTexImage3D.我认为,为了避免3 new对三指针然后对delete所有事情都非常小心,boost::multiarray本来可以非常有用,所以我已经习惯了.

boost::multi_array<GLubyte, 3> texture3DVolume;
texture3DVolume.resize(boost::extents[textureSizeX][textureSizeY][textureSizeZ]);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &(this->textureID));
glBindTexture(GL_TEXTURE_3D, this->textureID);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_3D);
glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, this->textureSizeX,this->textureSizeY, this->textureSizeZ,  0, GL_LUMINANCE, GL_UNSIGNED_BYTE, texture3DVolume.data());

int textureSizeX=512;
int textureSizeY=512
int textureSizeZ=511;
Run Code Online (Sandbox Code Playgroud)

用511我得到了歪斜的纹理.对于[-0.5,0.5]x[-0.5,0.5]x[-0.5,0.5]我使用的每个顶点(立方体的顶点),纹理坐标使用非常简单的着色器制作:

// vertex shader...
texture_coordinate = (v.xyz+vec3(1.0))*0.5;
// then in the fragment shader
gl_FragColor = texture(my_color_texture, texture_coordinate);
Run Code Online (Sandbox Code Playgroud)

但我的结果是扭曲的.我真的不知道我是否有关于如何布置数据boost::multiarray或什么...的问题我的结果如下:

这是一个应该是多维数据集的视图,其中两侧被来自体积数据集的球体覆盖

如你所见,球体是倾斜的,这是因为width==height它们是!=depth.我想更好地理解这是否是数据如何布局和/或跨越的问题.

如果我设置depth=512我得到正确比例的立方体. 在此输入图像描述

c++ opengl boost rendering

2
推荐指数
1
解决办法
310
查看次数

重复整数列表

什么是创建给定大小列表的最pythonic方式,N= l*k其中l是不同符号的数量(为简单起见整数),并且k是这样的子序列长度:

N=12,l=4,k=3

[ 0,0,0, 1,1,1, 2,2,2, 3,3,3 ]
Run Code Online (Sandbox Code Playgroud)

或此,例如N=15 l=3,k=5:

[ 0,0,0,0,0, 1,1,1,1,1, 2,2,2,2,2 ]
Run Code Online (Sandbox Code Playgroud)

应该经常调用此函数,因此需要速度.

python algorithm list

2
推荐指数
1
解决办法
127
查看次数

使用两个索引在Numpy中进行逻辑索引,如MATLAB中所示

如何使用Numpy复制在MATLAB中完成的索引?

X=magic(5);
M=[0,0,1,2,1];
X(M==0,M==2)
Run Code Online (Sandbox Code Playgroud)

返回:

ans =
  8
 14
Run Code Online (Sandbox Code Playgroud)

我发现在Numpy中这样做是不正确的,因为它不会给我相同的结果..

X = np.matrix([[17, 24,  1,  8, 15],
        [23,  5,  7, 14, 16],
        [ 4,  6, 13, 20, 22],
        [10, 12, 19, 21,  3],
        [11, 18, 25,  2,  9]])

M=array([0,0,1,2,1])
X.take([M==0]).take([M==2], axis=1)
Run Code Online (Sandbox Code Playgroud)

因为我得到:

 matrix([[24, 24, 24, 24, 24]])
Run Code Online (Sandbox Code Playgroud)

在numpy中使用两个索引进行逻辑索引的正确方法是什么?

python indexing matlab numpy

2
推荐指数
1
解决办法
3340
查看次数

Udev规则在Ubuntu 12.04上不适用于libusb

我在Ubuntu 12.04.5 LTS,x86_64.

我有一个使用libusb与计算机通信的USB设备.一旦我将其插入计算机并运行通信程序,我收到以下错误:

libusb couldn't open USB device /dev/bus/usb/008/004: Permission denied.
libusb requires write access to USB device nodes.
libusb failed to find the Optotrak USB device.  Are you sure you have set the udev permissions correctly?
Run Code Online (Sandbox Code Playgroud)

所以,如果我按照以下方式修改/ dev/bus/usb/008/004:

sudo chmod 777 /dev/bus/usb/008/004
Run Code Online (Sandbox Code Playgroud)

再次运行通讯程序,然后设备完美运行.问题是每次我插入设备时,最后一个数字都会改变,所以每次usb总线都要chmod,但是因为并非所有用户都知道管理员密码,所以这是一个问题.

因此,制造商建议按如下方式编辑udev规则.在/etc/udev/rules.d中创建一个12-ndi规则:

BUS=="usb", SYSFS{idVendor}=="0403", SYSFS{idProduct}=="da77", GROUP="plugdev"
Run Code Online (Sandbox Code Playgroud)

(我已经用lsusb检查过SYSFS是否正确)

lsusb 

Bus 008 Device 004: ID 0403:da77 Future Technology Devices International, Ltd 
Run Code Online (Sandbox Code Playgroud)

然后重新加载规则:

sudo udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)

但仍未正确设置总线008/004的权限.

如何在每次重启时制作这些规则?如果我改变USB设备的端口,我也想让它们永久化.

linux usb ubuntu libusb udev

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

便携式字符换行

有没有办法编写一个跨平台解析器来读取字符,直到找到换行符?我在Linux中使用'\ 0',但我不确定这是否也可以在Windows上完成.

std::string line;
// fill the line
QTextStream ss(&line);

for(;;)
{
    ss >> c;
    if(c == '"' || c=='\0' ) // here I want to continue parsing until a new-line character or a ending double quote is found 
        break;
}
Run Code Online (Sandbox Code Playgroud)

c c++ qt newline stream

0
推荐指数
1
解决办法
992
查看次数