小编Nic*_*mer的帖子

从索引数组的函数返回等效的`:`

我有一个大型数组和一个将索引列表返回到数组中的函数,即

import numpy

n = 500
a = numpy.random.rand(n)

def get_idx(k):
    # More complicated in reality
    return range(n) if k > 6 else range(k)

data = a[get_idx(29)]
data = a[get_idx(30)]
# ...
Run Code Online (Sandbox Code Playgroud)

一个典型的例子是范围是整个数组range(n).不幸的是,a[range(n)]随着n时间的缩放a[:]当然是恒定时间.这是一个不能返回可惜:get_idx.

我可以返回什么get_idx作为整个数组的索引?

python arrays numpy

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

python cProfile/snakeviz 无法处理调用同一函数的多个函数

我在解释数据时遇到问题cProfile。为了向您展示我的问题,我创建了这个简单的脚本。

函数 D 调用 B 和 C,它们都调用 A。
函数 A 显然占用了 1 秒(+开销)。
如果我们查看蛇形可视化结果,您会发现报告有点奇怪。我知道函数 A 总共花费了 2 秒,但在函数 C 内,函数 A 只花费了 1 秒,这就是我感兴趣的。有谁知道是否有一个设置(或不同的查看器)在其中我的没有这个问题吗?

import time
import cProfile

def A():
    time.sleep(1)

def B():
    A()

def C():
    A()

def D():
    B()
    C()

cProfile.run('D()','profileResults.prf')
Run Code Online (Sandbox Code Playgroud)

蛇可视化结果

python cprofile

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

使用 WebGL 渲染全屏四边形

我有一个用于渲染场景的帧缓冲区,现在我想将其渲染为“全屏”四边形。我如何设置我的相机以及我应该在我的顶点着色器中放入什么以便将帧缓冲区的纹理渲染到整个屏幕。

我试过像这样创建一个全屏四边形

var gl = this.gl;
var quad_vertex_buffer = gl.createBuffer();
var quad_vertex_buffer_data = new Float32Array([ 
    -1.0, -1.0, 0.0,
     1.0, -1.0, 0.0,
    -1.0,  1.0, 0.0,
    -1.0,  1.0, 0.0,
     1.0, -1.0, 0.0,
     1.0,  1.0, 0.0]);
gl.bufferData(quad_vertex_buffer, quad_vertex_buffer_data, gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, quad_vertex_buffer);
gl.vertexAttribPointer(this.shaderProgram.vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
//gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
gl.drawArrays(gl.TRIANGLES,0, 6);
Run Code Online (Sandbox Code Playgroud)

但它仍然使一切变黑。我可以遵循任何想法或示例/教程?

framebuffer webgl

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

避免尝试 - 除了嵌套

给定一个未知文件类型的文件,我想用多个处理程序之一打开该文件.如果无法打开文件,则每个处理程序都会引发异常.我想尝试所有这些,如果没有成功,提出异常.

我想出的设计是

filename = 'something.something'
try:
    content = open_data_file(filename)
    handle_data_content(content)
except IOError:
    try:
        content = open_sound_file(filename)
        handle_sound_content(content)
    except IOError:
        try:
            content = open_image_file(filename)
            handle_image_content(content)
        except IOError:
            ...
Run Code Online (Sandbox Code Playgroud)

这种级联似乎不是正确的方法.

有什么建议?

python exception-handling nested try-catch

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

强制派生类以覆盖数据成员

我有一个虚类A的数据valval2.val由...设置A,但val2应该由子项设置A(基于值val).我想强制每个派生类设置val2.下列

#include<iostream>

class A {
  public:
    A(): val(1), val2(getVal2())
    {};

    int val;
    int val2;

    protected:
      virtual int getVal2() = 0;
  };

class B: public A {
  protected:
    virtual int getVal2() { return 2*val; };
};

int main(){
  B b;
  std::cout << b.val2 << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

没有因为构造工作A调用一个函数(getVal2),这在当时还没有被定义为:

/tmp/cc7x20z3.o: In function `A::A()':
test9.cpp:(.text._ZN1AC2Ev[_ZN1AC5Ev]+0x1f): undefined reference to …
Run Code Online (Sandbox Code Playgroud)

c++

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

检查表达式是否包含符号

如果SymPy表达式包含符号,我想以编程方式找出.例如,为

import sympy
x = sympy.Symbol('x')
y = sympy.Symbol('y')
a = 4 + x**2 + y
b = 4 + y**2
Run Code Online (Sandbox Code Playgroud)

a包含xy,b仅包含y.

sympy

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

初始化std :: map <...,boost :: any>中的子图

初始化a时std::map<std::string, boost::any>,该值boost::any确实可以采用任何类型的值,包括std::maps.然而,他们需要首先明确定义,例如,

#include <map>
#include <boost/any.hpp>
int main() {
  std::map<std::string, boost::any> a = {{"y", 2}};

  std::map<std::string, boost::any> any = {
    {"hh", 4},
    {"g", a}  // alright
  };
}
Run Code Online (Sandbox Code Playgroud)

隐含地尝试同样的事情,例如,

#include <map>
#include <boost/any.hpp>
int main() {
  std::map<std::string, boost::any> any = {
    {"hh", 4},
    {"g", {{"y", 2}}}  // mööp
  };
}
Run Code Online (Sandbox Code Playgroud)

导致编译错误

error: could not convert ‘{{"hh", 4}, {"g", {{"y", 2}}}}’ from ‘<brace-enclosed initializer list>’ to ‘std::map<std::__cxx11::basic_string<char>, boost::any>’
Run Code Online (Sandbox Code Playgroud)

出了什么问题?有没有办法让初始化适合一个语句?

c++ boost dictionary c++11

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

零与基类析构函数的规则

我有一个基类Base和一个派生类D,我想为我自动生成移动构造函数和移动赋值运算符.遵循Zero规则,我将所有内存管理留给编译器,只使用level-2类(没有原始指针,数组等):

#include <iostream>

class Base{
  public:
    Base(): a_(42) {}
    virtual void show() { std::cout << "Base " << a_ << std::endl; }

  private:
    int a_;
};

class D : Base {
  public:
    D(): b_(666) {}
    void show() { std::cout << "D " << b_ << std::endl; }

  private:
    int b_;
};

int main() {
  Base b;
  b.show();
  D d;
  d.show();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这应该是吧,对吗?

输入C++核心指南:

基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.

啊,所以我想我必须添加一个析构函数Base.但这将取消自动生成的移动功能!

什么是干净的出路?

c++ c++11 rule-of-zero

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

CMake include() 与 find_package() 的默认搜索路径

我在我的 Debian 机器上安装了 VTK6,它将所有的 CMake 文件放在

$ ls /usr/lib/cmake/vtk-6.3/
[...]
VTKConfig.cmake
vtkModuleAPI.cmake
[...]
Run Code Online (Sandbox Code Playgroud)

当我做

find_package(VTK)
Run Code Online (Sandbox Code Playgroud)

在另一个项目中,一切正常。然而,

include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)

产生错误

include could not find load file:

  vtkModuleAPI
Run Code Online (Sandbox Code Playgroud)

我一直认为find_package()include共享相同的搜索路径,特别是CMAKE_MODULE_PATH. 显然这是不正确的。

注意

SET(CMAKE_MODULE_PATH "/usr/lib/cmake/vtk-6.3")
include(vtkModuleAPI)
Run Code Online (Sandbox Code Playgroud)

确实有效。

另请注意,我使用的是 CMake 3.5,因此不再FindVTK.cmake 像以前那样使用.

什么是默认的搜索路径find_package()include()?为什么vtkModuleAPI.cmake找不到?

cmake

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

cout矢量std :: any

我有一个std::vectorstd::any,所有这些都可以通过被印刷<<(例如,仅整型和浮点).我喜欢有类似的东西

#include <experimental/any>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::experimental::any> v;

  v.push_back(1);
  v.push_back(3.14);

  for (const auto& a: v) {
    std::cout << a << std::endl;
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为std::any不知道<<:

error: no match for ‘operator<<’
Run Code Online (Sandbox Code Playgroud)

到目前为止,我提出的唯一解决方法是将向量项明确地转换为其中可能包含的任何数据类型,例如,

#include <experimental/any>
#include <iostream>
#include <vector>

int main() {
  std::vector<std::experimental::any> v;

  v.push_back(1);
  v.push_back(3.14);

  for (const auto& a: v) {
    try {
        std::cout << std::experimental::any_cast<int>(a) << std::endl;
    } catch (const std::experimental::fundamentals_v1::bad_any_cast&)
    {}

    try {
        std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ c++17

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