小编zep*_*hyr的帖子

懒惰评估地图

我最近读到mapPython 3 中的一个好处是它很懒.这意味着,做得更好

map(lambda x: x**2, range(10**100))
Run Code Online (Sandbox Code Playgroud)

而不是

[x**2 for x in range(10**100)]
Run Code Online (Sandbox Code Playgroud)

我很好奇的是,我如何能够使用这种懒惰.如果我生成地图对象,我怎么能访问结果操作/列表中的特定元素.在几乎每一个文档,map我所看到的,他们会做这样的事情print(map(...))for i in map(...)其中(据我所知)放弃懒概念,因为它隐含映射到一个列表转换.

我想我正在寻找的是能够以类似的懒惰方式使用地图对象,就像range我可以做的那样,懒散x = range(10**100)地生成x[10000]而没有巨大的计算负荷.

如果这个概念不存在,那么map懒惰的好处是什么?如果你总是需要把它转换成一个非懒惰的对象,比如列表,为什么map懒惰呢?

python lazy-evaluation map-function

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

根据字符串输入返回sizeof

我正在寻找一种在C中有一个函数的方法,它接受一个定义特定变量类型的字符串作为输入.然后,该函数返回该sizeof输入的结果,就好像该字符串被评估为一个类型一样.考虑下面的例子.

#include <stdint.h>

typedef struct my_struct {
    int16_t var1;
    int16_t var2;
    int16_t var3;
} mystruct_t;

int main(int argc, char * argv[])
{
    return sizeof(argv[1]); // THIS IS WRONG!!
}
Run Code Online (Sandbox Code Playgroud)

然后用户可以编译它并尝试调用./myprogram my_struct_t我希望my_struct_t在运行时在我的机器上返回实际C字节大小的位置.

我不确定的部分是显然这会得到存储在其中的(指向)字符串argv[1]的大小,而不是字符串定义的类型的大小.我怎样才能进行这种转换?这甚至可能吗?

c sizeof

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

矢量化Matlab从头到尾替换数组值

我有一个数组,我想在一个已知的索引集合中替换其前面的值.举个例子,我的数组可能是

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
Run Code Online (Sandbox Code Playgroud)

并且要被先前值替换的值的索引可能是

y = [2, 3, 8];
Run Code Online (Sandbox Code Playgroud)

我希望这个替换从左到右发生,或者从头到尾发生.也就是说,索引2处的值应该被索引1处的值替换,之后索引3处的值将被索引2处的值替换.使用上面的数组的结果应该是

[1, 1, 1, 4, 5, 6, 7, 7, 9, 0]
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用明显的方法在Matlab中实现这一点,我的结果是

>> x(y) = x(y-1)

x =

     1     1     2     4     5     6     7     7     9     0
Run Code Online (Sandbox Code Playgroud)

希望您可以看到此操作从右到左执行,索引3处的值替换为索引2处的值,然后将2替换为1.

我的问题是:有没有办法以一种简单的方式实现我想要的结果,没有蛮力循环阵列或做一些耗时的事情,比如反转阵列?

arrays matlab vectorization indices

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

使用scipy.optimize.minimize查找全局最小值

给定2D点p,我试图计算该点与功能曲线之间的最小距离,即找到曲线上的点,该点给出最小距离p,然后计算该距离.我正在使用的示例函数是

f(x) = 2*sin(x)
Run Code Online (Sandbox Code Playgroud)

我的距离函数用于某个点p和提供的函数之间的距离

def dist(p, x, func):
    x = np.append(x, func(x))
    return sum([[i - j]**2 for i,j in zip(x,p)])
Run Code Online (Sandbox Code Playgroud)

它作为输入,点p,x函数上的位置和函数句柄func.注意这是一个平方欧几里德距离(因为欧几里德空间中的最小化与平方欧几里德空间中的最小化相同).

这个的关键部分是我希望能够为我的函数提供边界,所以我真的找到了与函数段最近的距离.对于这个例子,我的界限是

bounds = [0, 2*np.pi]
Run Code Online (Sandbox Code Playgroud)

我正在使用该scipy.optimize.minimize函数来最小化我的距离函数,使用边界.上述过程的结果如下图所示.

距离的等高线图

这是显示距sin函数的距离的等高线图.请注意轮廓中是否存在不连续性.为方便起见,我在不连续点和它们映射到的曲线上的"壁橱"点上绘制了几个点.

这里实际发生的是scipy函数是找到局部最小值(给出一些初始猜测),但不是全局函数,这导致了不连续性.我知道找到任何函数的全局最小值是不可能的,但我正在寻找一种更可靠的方法来找到全局最小值.

找到全局最小值的可能方法是

  1. 选择一个聪明的初始猜测,但这相当于知道全局最小值开始的大致位置,这是使用问题的解决方案来解决它.
  2. 使用多个初始猜测并选择达到最佳最小值的答案.然而,这似乎是一个糟糕的选择,特别是当我的函数变得更复杂(和更高维度)时.
  3. 找到最小值,然后扰乱解决方案并再次找到最小值,希望我可能已将它打到更好的最小值.我希望可能有一些方法可以做到这一点,而不需要引用一些复杂的MCMC算法或类似的东西.速度计入此过程.

有关最佳方法的任何建议,或可能解决这个问题的有用功能的方向都会很棒!

python algorithm minimize scipy

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

有关在c ++中删除变量的详细信息

我试图准确理解c ++中删除的变量会发生什么.假设我有以下内容.

MyObject * obj;

for (int i = 0; i < 100000000; i++){
    obj = someMethodThatReturnsNewMyObject();
    obj->doSomething();
    delete obj;
}
Run Code Online (Sandbox Code Playgroud)

现在,在实例化时,obj是一个指向MyObject对象的指针.它首先由该线初始化obj = someMethodThatReturnsNewMyObject();.然后一些方法被称为只是为了好玩,并被obj删除.现在我知道当像这样删除某些东西时,它指向的内存空间被清除,指针被设置为什么都没有.

但是,当for循环回来时,我重新初始化指针,导致它分配一个新的内存空间,obj然后指向这个新的空间.但是,指针本身从内存中移除了.在整个循环过程中,它只指向我指出的任何指向或指向任何东西(删除时).

那么我的问题是:指针本身是什么时候,即指针占用的内存空间,什么时候被删除?为什么我不需要删除它,如果我需要删除指向的内存?

c++ pointers

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

c ++中用于未分配对象的垃圾收集

我还在学习c ++的所有细节,我对如何根据我正在做的特定任务处理垃圾收集有一个具体的问题.我有一些类,Vector2D包含一个矢量的坐标,以及一组可以对矢量做的数学属性(点积,旋转,缩放等).下面给出了一个给出布局的示例头文件.

#ifndef VECTOR2D_H
#define VECTOR2D_H

class Vector2D{
private:
    double x, y;

public:    
    Vector2D(double var1, double var2, int coordinateType);
    Vector2D *  normalize();
    Vector2D *  rotate(double angle);
    Vector2D *  scale(double value);
};
Run Code Online (Sandbox Code Playgroud)

现在,我以特定的方式创建了这个类,以获得特定的功能.Vector2D比如vec,当我有一个对象时,我希望能够对该对象进行操作并获取一个新对象,而不是更改该vec对象.我也想要链接命令的能力.这样我可以做一些比如缩放vec,然后用命令旋转它vec = vec.scale(5).rotate(45).由于这个原因,这些方法中的每一个都只返回一个新Vector2D对象而不是更改vec参数.

我的问题来自垃圾收集.我只是不知道c ++如何处理这个以及我应该如何处理它.技术上在vec.scale(5)创建一个新的Vector2D对象的过程中创建,然后我做.rotate(45),但然后再也不用了.更重要的是,我甚至无法访问新创建的对象,因为我从未将其分配给任何东西.所以我的问题就是这个.

1)我是否必须担心删除这些新对象或c ++知道自己删除它们?

2)如果我必须删除它,如何在不引用该对象的情况下这样做?

3)如果(2)不能完成但需要完成,我的代码构造是不好的做法?我应该改变它不做我做过的事吗?

谢谢!

c++ garbage-collection

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

更改tkinter小部件位置

我的代码类似于以下内容

import tkinter as tk
from tkinter import Tk
from tkinter import ttk

root = Tk()

ttk.Label(root, text = 'label text', justify = 'center').grid(row=0, column=0)
string = tk.StringVar()
string.set('entry text')
ttk.Entry(root, textvariable = string).grid(row=0, column=1)
mainButton = ttk.Button(root, text = 'BUTTON').grid(row = 1, columnspan = 2)

root.pack()
Run Code Online (Sandbox Code Playgroud)

实际上,这使得第一行在其旁边有一个标签和一个文本框,在同一行上,然后是两个下面的按钮.现在,当按下该按钮时,我想在包含按钮的行中添加新标签/条目,并将按钮向下移动一行.有可行的方法吗?

python user-interface tkinter

-1
推荐指数
1
解决办法
2960
查看次数