小编zep*_*hyr的帖子

CUDA中的动态共享内存

我要提出的问题也有类似的问题,但我觉得他们中没有一个能够解决我真正想要的问题.我现在拥有的是一种CUDA方法,需要将两个数组定义到共享内存中.现在,数组的大小由在执行开始后读入程序的变量给出.因此,我不能使用该变量来定义数组的大小,因为定义共享数组的大小需要在编译时知道值.我不想做某些事情,__shared__ double arr1[1000]因为手工输入大小对我来说没用,因为这会根据输入而改变.同样,我不能用来#define为大小创建一个常量.

现在我可以按照类似于手册(http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#shared)中的示例进行操作,例如

extern __shared__ float array[];
__device__ void func()      // __device__ or __global__ function
{
    short* array0 = (short*)array; 
    float* array1 = (float*)&array0[128];
    int*   array2 =   (int*)&array1[64];
}
Run Code Online (Sandbox Code Playgroud)

但这仍然是一个问题.根据我的阅读,定义共享数组总是使内存地址成为第一个元素.这意味着我需要使第二个数组按第一个数组的大小移动,就像它们在这个例子中所做的那样.但是第一个数组的大小取决于用户输入.

另一个问题(Cuda共享内存数组变量)有一个类似的问题,他们被告知创建一个单独的数组,作为两个数组的数组,只需调整索引以正确匹配数组.虽然这似乎做了我想要的,但它看起来非常混乱.有没有办法解决这个问题,以便我仍然可以维护两个独立的数组,每个数组的大小都被用户定义为输入?

cuda

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

MATLAB如何处理动态数组分配?

我不精通MATLAB和很好奇如何处理动态内存分配的引擎盖下

一种主要方法是分配大块而不是必需的,这样就不必为添加的每个新元素分配.在进行一些研究时,我看到很多人亲自管理他们自己的大块分配(假设他们不知道他们的最终大小)或做了诸如创建最大尺寸,然后修剪的事情.一个例子是未记录的MATLAB,它建议您自己执行块内存分配.我本以为像MATLAB这样的语言会知道自己这样做,我不会被要求关注这样的问题.这对我来说意味着如果你试图将一个新元素附加到一个数组上,MATLAB只为那个单独的元素分配新的内存,这是非常低效的.

我的问题是双重的

  • 对于动态数组,MATLAB是否分配了大块,并且存储的内存超过了节省计算效率所需的内存,还是只为连接的内容分配内存?
  • 如果前者是这种情况,那么MATLAB是否选择采用这种设计?

arrays matlab memory-management

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

具有重复值的Python枚举

我在使用一些属性具有相同值的枚举时遇到麻烦。我认为Enums对python来说是如此新奇,以至于我找不到关于此问题的任何其他参考。无论如何,假设我有以下情况

class CardNumber(Enum):
    ACE      = 11
    TWO      = 2
    THREE    = 3
    FOUR     = 4
    FIVE     = 5
    SIX      = 6
    SEVEN    = 7
    EIGHT    = 8
    NINE     = 9
    TEN      = 10
    JACK     = 10
    QUEEN    = 10
    KING     = 10
Run Code Online (Sandbox Code Playgroud)

显然,这些是黑色插孔中的卡号及其对应的值。十个通王具有相同的价值。但是如果我做这样的事情print(CardNumber.QUEEN),我会回来的<CardNumber.TEN: 10>。更重要的是,如果我遍历这些,它只会遍历唯一值。

>>> for elem in CardNumber:
...     print(elem)
CardNumber.ACE
CardNumber.TWO
CardNumber.THREE
CardNumber.FOUR
CardNumber.FIVE
CardNumber.SIX
CardNumber.SEVEN
CardNumber.EIGHT
CardNumber.NINE
CardNumber.TEN
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?我希望CardNumber.QUEEN和CardNumber.TEN是唯一的,并且都出现在任何迭代中。我唯一能想到的就是为每个属性赋予第二个值,该值将充当一个不同的id,但这似乎是不可思议的。

python enums

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

如何更改pyplot中各个图例条目的字体大小?

我要做的是控制pyplot中图例中各个条目的字体大小.也就是说,我希望第一个条目是一个大小,第二个条目是另一个条目.这是我尝试解决方案,但不起作用.

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(1,5,0.5)
plt.figure(1)
plt.plot(x,x,label='Curve 1')
plt.plot(x,2*x,label='Curve 2')
leg = plt.legend(loc = 0, fontsize = 'small')
leg.get_texts()[0].set_fontsize('medium')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我的期望是所有图例条目的默认大小都是"小".然后,我获得Text对象的列表,并将仅一个Text对象的fontsize更改为medium.但是,由于某些原因,这会将所有Text对象字体大小更改为中等,而不是仅仅是我实际更改的单个字体.我发现这很奇怪,因为我可以用这种方式单独设置其他属性,如文本颜色.

最终,我只需要一些方法来更改单个条目的字体大小以用于图例.

python matplotlib legend

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

在类中创建方法属性

我可以创建以下格式的函数。

def bar():
    if not hasattr(bar, 'c'):
        bar.c = 0
    bar.c += 1
    return bar.c
Run Code Online (Sandbox Code Playgroud)

运行时,将按预期产生以下输出:

>>> bar()
1
>>> bar()
2
>>> bar()
3
Run Code Online (Sandbox Code Playgroud)

但是,如果我突然将此函数移至类,Python会给我一个错误。

class Foo(object):

    def bar(self):
        if not hasattr(self.bar, 'c'):
            self.bar.c = 0
        self.bar.c += 1
        return self.bar.c
Run Code Online (Sandbox Code Playgroud)

现在我明白了

>>> foo = Foo()
>>> foo.bar()
...
AttributeError: 'method' object has no attribute 'c'
Run Code Online (Sandbox Code Playgroud)

它告诉我它没有属性,但是我正在尝试创建属性。这里发生了什么?

python

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

Matlab delaunayn与Scipy Delaunay的区别

我正在尝试使用scipy.spatial.Delaunay函数复制由Python中的Matlab delaunayn函数执行的N维Delaunay三角剖分.然而,虽然Matlab函数给了我想要和期望的结果,但是scipy给了我不同的东西.考虑到两者都是QHull库的包装器,我发现这很奇怪.我假设Matlab在其调用中隐式设置了不同的参数.我试图在两者之间复制的情况可以在Matlab的文档中找到.

设置是在中心有一个点,如下所示.我提供的蓝线有助于形象化,但它们没有任何目的或意义.

一个点在中心的立方体

我期望的三角测量结果是12个单纯形式(在Matlab示例中列出),如下所示.

Matlab的三角测量

然而,这个python等效产生"额外"的单纯形.

x = np.array([[-1,-1,-1],[-1,-1,1],[-1,1,-1],[1,-1,-1],[1,1,1],[1,1,-1],[1,-1,1],[-1,1,1],[0,0,0]])
simp = scipy.spatial.Delaunay(x).simplices
Run Code Online (Sandbox Code Playgroud)

返回的变量simp应该是一个M×N数组,其中M是找到的单纯数(对于我的情况应该是12),N是单数中的点数.在这种情况下,每个单形都应该是四面体,意味着N是4.

我发现的是,M实际上是18,额外的6个单纯形不是四面体,而是立方体的6个面.

这里发生了什么?如何将返回的单纯形式限制为仅仅是四面体?我用这个简单的案例来证明这个问题,所以我想要一个不适合这个问题的解决方案.

编辑

感谢Amro的回答,我能够解决这个问题,我可以在Matlab和Scipy之间找到一个简单的匹配.有两个因素在起作用.首先,正如所指出的,Matlab和Scipy使用不同的QHull选项.其次,QHull返回零容量的单纯形.Matlab删除了这些,Scipy没有.这在上面的例子中很明显,因为所有6个额外的单纯形都是立方体的零体积共面面.可以使用以下代码在N维中删除它们.

N = 3 # The dimensions of our points
options = 'Qt Qbb Qc' if N <= 3 else 'Qt Qbb Qc Qx' # Set the QHull options
tri = scipy.spatial.Delaunay(points, qhull_options = options).simplices
keep = np.ones(len(tri), dtype = bool)
for i, t in enumerate(tri):
    if abs(np.linalg.det(np.hstack((points[t], np.ones([1,N+1]).T)))) < 1E-15:
        keep[i] = False # Point is coplanar, we don't want …
Run Code Online (Sandbox Code Playgroud)

python matlab delaunay scipy qhull

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

从numpy数组中获取非重复行

假设我有一个表单的 numpy 数组

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

我想从中得到一个数组,它只包含不重复的行,即,我希望从这个例子中得到

array([[4, 5],
       [1, 4]])
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种速度相当快且可扩展的方法。我能想到的唯一方法是

  1. 首先在 中找到一组唯一的行x,作为一个新数组y
  2. 创建一个新数组z,其中y删除了 from 的那些单个元素x,因此z是 中重复行的列表x
  3. x和之间做一组差异z

但这似乎非常低效。有人有更好的方法吗?

如果这很重要,我保证我的每一行都会从小到大排序,这样你就永远不会有一行是[5, 2]or [3, 1]

python arrays numpy

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

以编程方式将 matplotlib 图设置为初始缩放级别

我有一个图应该查看范围内的整个数据集x = [-1,1]y = [-1,1]. 当我在 matplotlib 中绘制它时,我可以用xlim([-1,1])和设置这个范围ylim([-1,1])。然后我可以玩弄该图,如果我愿意,可以放大某些功能,以便我的查看区域现在显示x = [-0.5,0.5]y = [-0.5,0.5]. 但是,如果我打了工具栏上的主页按钮,它会返回我去xlimylim默认范围。

我希望发生的是,我想为 x 和 y 限制设置“默认范围”,这样当按下主页按钮时,绘图将返回到这些范围,但是当绘图首次出现时,我想要将其放大到较小的范围。也就是说,当情节第一次出现时,我想查看范围x = [-0.5,0.5]and y = [-0.5,0.5],但是打回家会让我回到x = [-1,1]and y = [-1,1]。显然,我不能使用xlim([-0.5,0.5])ylim([-0.5,0.5])使情节首先以这种方式出现,因为在这种情况下,点击主页按钮只会将我发送到情节的放大版本。

有没有办法做我想做的事?我没有看到任何说明如何执行此操作的文档。如果重要的话,我使用的是 python 3.5 和 matplotlib 1.5.1。

python matplotlib

5
推荐指数
0
解决办法
637
查看次数

在Mac OS X上以编程方式为Matplotlib选择正确的后端

我有一个集成了tkinter GUI以及matplotlib图(使用pyplot)的程序。让该程序在各种Mac平台上正常运行时,我遇到了无尽的麻烦。主要问题似乎在于适当选择后端。

在某些情况下,程序运行正常没有问题。在其他情况下,我遇到了与此问题相关的类似问题。实施此处概述的解决方案可以解决该问题,但是其他系统会弹出其他错误。解决这些其他错误的方法似乎是使用Qt4Agg后端。

必须有一些使用tkinter和matplotlib来同时获取程序的标准方法,才能与Mac配合使用。如何以编程方式确保使用了正确的后端,这样该程序对于Mac用户不会崩溃?

抱歉,如果不清楚,这是一个非常广泛的问题。

macos tkinter matplotlib python-3.x

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

强制TkInter Scale滑块捕捉鼠标

当GUI具有TkInter Scale并且它们在刻度上的某处单击时,默认行为似乎是沿着Scale向滑动方向滑动滑块(然后意外地通过鼠标).

我想要的是让滑块始终跳到并保持连接到用户的鼠标点,同时他们点击滑块上的任何位置.如果他们单击"比例"上的特定点,滑块应直接跳到该点.

我有一些代码尝试这样做,但似乎没有工作,我找不到它的原因.

import tkinter as tk
from tkinter import ttk

def show_values():
    print('w1 set to',w1.get())

def snapToVal1(val):
    scaleVal = float(w1.get())
    if int(scaleVal) != scaleVal:
        w1.set(round(float(val)))

def scaleFunc1(event):
    g = w1.grid_info()
    w1.set(round(8 * (event.y - g['pady'])/(w1.winfo_height() - 2*g['pady'] - 2*g['ipady']))-1)
    print('w1 set to',w1.get())

#---
root = tk.Tk()

f1 = ttk.Frame(root, relief = tk.GROOVE)

ttk.Label(f1, text='Stellar\nType').grid(row=0,column=0, columnspan=2,padx=2,pady=2)

for i,text in enumerate(['O','B','A','F','G','K','M','L']):
    ttk.Label(f1, text = text).grid(row=i+1,column=0,pady=5,padx=(2,0))

w1 = ttk.Scale(f1, to=7, command=snapToVal1, orient=tk.VERTICAL)
w1.grid(row = 1, column = 1, rowspan = …
Run Code Online (Sandbox Code Playgroud)

python tkinter

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