小编wal*_*mat的帖子

numpy:行数乘以数组

我有那些数组:

a = np.array([
     [1,2],
     [3,4],
     [5,6],
     [7,8]])

b = np.array([1,2,3,4])
Run Code Online (Sandbox Code Playgroud)

我想让它们像这样繁殖:

[[1*1, 2*1],
[3*2, 4*2],
[5*3, 6*3],
[7*4, 8*4]]
Run Code Online (Sandbox Code Playgroud)

...基本上out[i] = a[i] * b[i],这里a[i].shape(2,)b[i]则是标量.

有什么诀窍?np.multiply似乎不起作用:

>>> np.multiply(a, b)
ValueError: operands could not be broadcast together with shapes (4,2) (4)
Run Code Online (Sandbox Code Playgroud)

python numpy

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

管道中的多处理正确完成

我想知道如何正确地完成多处理.假设我有一个[1,2,3,4,5]由函数生成的列表,该列表f1被写入Queue(左绿色圆圈).现在我开始从该队列中拉出两个进程(通过f2在进程中执行).他们处理数据,比如说:将值加倍,然后将其写入第二个队列.现在,函数f3读取此数据并将其打印出来.

数据流的布局

在函数内部有一种循环,试图永远从队列中读取.我该如何停止这个过程?

想法1

f1不仅发送列表,还发送一个None对象或一个custon对象,class PipelineTerminator: pass或者一些只是一直向下传播的对象.f3现在等待None来,当它在那里时,它突然出现了.问题:两个f2s 中的一个可能会读取并传播,None而另一个仍在处理数字.然后最后一个值丢失.

想法2

f3f1.因此,该函数f1生成数据和管道,生成流程f2并提供所有数据.产卵和喂食后,它会监听第二根管道,只需计算和处理收到的物体.因为它知道输入了多少数据,所以它可以终止执行的进程f2.但如果目标是设置处理管道,则不同的步骤应该是可分离的.因此f1,f2并且f3是管道的不同元素,并且昂贵的步骤是并行完成的.

想法3

管道理念3

管道的每个部分都是一个功能,该功能可以根据需要生成流程并负责管理它们.它知道,有多少数据进入,返回了多少数据(yield可能).因此传播None对象是安全的.

setup child processes 

execute thread one and two and wait until both finished

thread 1:
    while True:
        pull from input queue
        if None: break and set finished_flag …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

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

指向几乎相同数据的两个std :: vector就是可能的

我有一个期望std::vector(调用它A)的算法.不过,我已经BN + 2条目和我基本上要为通过B.data() + 2,因此该算法得到最后N的条目B.如果A被修改,那么也是如此B.

当使用double*指针时,我非常清楚我应该如何制作它,但这对std::vectors 也是可能的吗?我的意思是,矢量的好处是它为我处理内存,我现在想要的是禁止它(如果B或被A破坏,它们应该保持指向的数据不变).

像这样:

std::vector< double > B({1,2,3,4,5});
std::vector< double > A(B.data() + 2, B.size() - 2);

// A and B share data now. A is 3, 4, 5
Run Code Online (Sandbox Code Playgroud)

我知道通过采用一对迭代器可以更好地为此目的设计算法,但这不在我手中.

UPDATE

(在评论中,有人希望看到签名,这里是)

nlopt::result nlopt::opt::optimize(std::vector<double> &x, double &opt_f);
Run Code Online (Sandbox Code Playgroud)

但是,我的初衷是非常聪明,让算法在我的向量中优化direclty B,所以我最终得到的是这样的:

std::vector< double > B(N + 2);
// do something with …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector c++11

11
推荐指数
1
解决办法
953
查看次数

Eigen中的系数自定义函数

我有一个do_magic方法,需要一个双倍,并添加42.我想这种方法应用到的每个系数Eigen::MatrixEigen::Array(这意味着,我不会介意,如果这是唯一可能与这两种类型中的一种).

这可能吗?

像这样:

Eigen::MatrixXd m(2, 2);    
m << 1,2,1,2;    
m.applyCoefficientWise(do_magic);
// m is now 43, 44, 43, 44
Run Code Online (Sandbox Code Playgroud)

c++ eigen

10
推荐指数
1
解决办法
3458
查看次数

包含头文件 - 相对于当前目录还是包含目录?

我有以下直接结构:

src
  +-- lib1
    +-- lib1.h
  +-- lib2
   +-- lib2.h
Run Code Online (Sandbox Code Playgroud)

双方lib1lib2都打算进行分配(安装).lib2利用lib1,所以它需要一些包括:

#include "../lib1/lib1.h" // 1
#include "lib1/lib1.h"    // 2
#include <lib1/lib1.h>    // 3
Run Code Online (Sandbox Code Playgroud)

(1)是直截了当的方式,但是非常不灵活.(2)是我目前使用的方式,但构建系统需要知道src需要添加到包含路径.(3)在分发方面对我来说似乎是最好的,因为可以假设标题位于标准位置,但对于我来说,构建系统如何处理它(在这种情况下,lib1需要先安装)lib2可以编译).

推荐的方式是什么?

c++ header-files

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

捕获信号:使用成员函数作为信号处理程序

我有一个在无限循环中做一些工作的对象.该main()实例化对象,并调用该run()方法.由于我不想使用线程,我需要一个解决方案来使我的对象停止运行.下面你看看我想出了什么.

struct Foo
{
    void run()
    {
        running = 1;
        while (running) 
            do_something_useful();

        std::cout << "Execution stopped." << std::endl;
    }

    bool running;

    void catch_signal(int signal)
    {
        std::cout << "Caught signal " << signal << std::endl;
        if( signal == SIGTERM ) 
            running = false;
    }

};
Run Code Online (Sandbox Code Playgroud)

如您所见,我需要异步发送信号.因此,我使用信号处理程序和sigaction.下面main我可以想象使用.

int main(int argc, char** argv)
{
    Foo foo;
    struct sigaction sigIntHandler;

    boost::function< void (int) > f;
    f = std::bind1st(
      std::mem_fun(&Foo::catch_signal), &foo);
    f(5);  // this call works …
Run Code Online (Sandbox Code Playgroud)

c++ linux signals

8
推荐指数
1
解决办法
6476
查看次数

std :: chrono:为time_point添加自定义持续时间

以下代码执行compile(g++ 4.7.2):

#include <chrono>

typedef std::chrono::duration< double > double_prec_seconds;
typedef std::chrono::time_point< std::chrono::system_clock > timepoint_t;

void do_something( const timepoint_t& tm )
{
    // ...
}

int main( int argc, char** argv )
{
    timepoint_t t0 = std::chrono::system_clock::now();
    timepoint_t t1 = t0 + std::chrono::seconds(3);

    // timepoint_t t3 = t0 + double_prec_seconds(3.14);
   auto t3 = t0 + double_prec_seconds(3.14);

    do_something( t1 );
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道什么类型t3.它不是timepoint_t,并且用明确给出的类型取消注释行将无法编译.与函数调用相同的:我不能叫do_somethingt3.

所以我的问题是:

  • 为什么转换失败?
  • 具有双精度秒持续时间的最佳方法是什么?

我知道我可以使用这样的额外演员

// this works
timepoint_t t3 = …
Run Code Online (Sandbox Code Playgroud)

c++ c++-chrono

8
推荐指数
1
解决办法
6983
查看次数

numpy:图像中唯一的颜色列表

我有一张图片img:

>>> img.shape
(200, 200, 3)
Run Code Online (Sandbox Code Playgroud)

在像素(100,100)上我有一个很好的颜色:

>>> img[100,100]
array([ 0.90980393,  0.27450982,  0.27450982], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:这张图片中有多少种不同的颜色,我该如何枚举它们?

我的第一个想法是numpy.unique(),但不知怎的,我正在使用这个错误.

python numpy

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

将协议缓冲区集成到WAF中

我设法编译我的.proto文件,如下所示:

def build(bld):
    bld(rule='protoc --cpp_out=. -I.. ${SRC}', source='a.proto b.proto', name='genproto')
Run Code Online (Sandbox Code Playgroud)

似乎工作得很好,当我对源文件进行更改时,它们会被重新编译,等等.但结果将文件叫build/a.pb.ccbuild/b.pb.cc我需要包括到我的主要节目源列表.当然我知道如何从我的协议缓冲区文件名中手动构造它们,但我不认为这是要走的路.任何人都可以提供一些提示吗?

最好的问候,菲利普

UPDATE

在IRC人员的帮助下,我能够设法构建一个工具,如下所示.

#!/usr/bin/env python
# encoding: utf-8
# Philipp Bender, 2012

from waflib.Task import Task
from waflib.TaskGen import extension 

"""
A simple tool to integrate protocol buffers into your build system.

    def configure(conf):
        conf.load('compiler_cxx cxx protoc_cxx')

    def build(bld):
    bld.program(source = "main.cpp file1.proto proto/file2.proto", 
            target = "executable") 

"""

class protoc(Task):
    run_str = '${PROTOC} ${SRC} --cpp_out=. -I..'
    color = 'BLUE'
    ext_out = ['.h', 'pb.cc'] …
Run Code Online (Sandbox Code Playgroud)

waf protocol-buffers

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

Redis 作为消息代理

我想以发布订阅的方式在应用程序之间传递数据。数据产生的速度可能比消耗的速度快得多,而且消息会丢失,这不是问题。想象一个快速传感器和一个慢速传感器数据处理器。为此,我使用 redis pub/sub 并编写了一个类作为订阅者,接收每条消息并将其放入缓冲区。当“真实”函数请求消息时,缓冲区会在新消息进入无效时被覆盖。因此,当我问这个类时,我立即得到了响应(提示我的函数比传入的数据慢)或者我必须等待(提示我的函数比数据快)。

这对于数据快速传入的情况非常有效。但对于其中涉及在相对较少的数据,让我们说每五秒钟,但这不是工作:想象我的消费者被轻微推出生产者,第一消息丢失和我的消费者需要等待将近五秒钟,直到它可以开始工作.

我想我必须用Redis工具来解决这个问题。而不是pub/sub,我可以简单地使用get/set方法,从而将缓存功能直接放入 Redis 中。但是,我的消费者将不得不轮询数据库,而不是我目前拥有的事件魔法。密钥可能看起来像“key:timestamp”,我的消费者现在必须get key:*永久比较时间戳,我认为这会导致大量负载。自然没有睡眠的可能性,因为虽然我不关心丢失的消息(我无能为力),但我确实关心延迟。

是否有人将 Redis 用于类似的事情,并且可以给我一些有关如何巧妙使用 Redis 工具和数据结构的提示?

编辑

理想情况下,我的程序流程如下所示:

  • 启动程序
  • key从 Redis 中检索
  • 告诉Redis,“嘿,通知我”的变化key
  • 异步启动一些东西,对新消息进行回调。

通过写这篇文章,一个想法出现了:发布者不仅发布message主题key,而且还发布set key message. 这样,应用程序最初可以get,然后subscribe

好主意还是不是真的?

得到以下答案后我做了什么(接受的答案)

密钥空间通知正是我在这里所需要的。Redis 作为信息的主要来源,我的客户端订阅了keyspace 通知,它通知订阅者有关影响特定键的事件。现在,在我的客户端的异步部分,我订阅了有关我感兴趣的密钥的通知。这些通知设置了一个key_has_updates标志。当我需要该值时,我get会从 Redis 中提取该值并取消设置该标志。使用未设置的标志,我知道服务器上没有该键的新值。如果没有键空间通知,这将是我需要轮询服务器的部分。优点是我可以使用各种数据结构,不仅是pub/sub机制,而且一个错过第一个事件的慢连接器总是能够get初始值,它pub/sib会丢失。

当我需要该值时,我从 Redis 获取该值并将标志设置为 false。

redis

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