我要提出的问题也有类似的问题,但我觉得他们中没有一个能够解决我真正想要的问题.我现在拥有的是一种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共享内存数组变量)有一个类似的问题,他们被告知创建一个单独的数组,作为两个数组的数组,只需调整索引以正确匹配数组.虽然这似乎做了我想要的,但它看起来非常混乱.有没有办法解决这个问题,以便我仍然可以维护两个独立的数组,每个数组的大小都被用户定义为输入?
我不精通MATLAB和很好奇如何处理动态内存分配的引擎盖下?
一种主要方法是分配大块而不是必需的,这样就不必为添加的每个新元素分配.在进行一些研究时,我看到很多人亲自管理他们自己的大块分配(假设他们不知道他们的最终大小)或做了诸如创建最大尺寸,然后修剪的事情.一个例子是未记录的MATLAB,它建议您自己执行块内存分配.我本以为像MATLAB这样的语言会知道自己这样做,我不会被要求关注这样的问题.这对我来说意味着如果你试图将一个新元素附加到一个数组上,MATLAB只为那个单独的元素分配新的内存,这是非常低效的.
我的问题是双重的
我在使用一些属性具有相同值的枚举时遇到麻烦。我认为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,但这似乎是不可思议的。
我要做的是控制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对象字体大小更改为中等,而不是仅仅是我实际更改的单个字体.我发现这很奇怪,因为我可以用这种方式单独设置其他属性,如文本颜色.
最终,我只需要一些方法来更改单个条目的字体大小以用于图例.
我可以创建以下格式的函数。
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)
它告诉我它没有属性,但是我正在尝试创建属性。这里发生了什么?
我正在尝试使用scipy.spatial.Delaunay函数复制由Python中的Matlab delaunayn函数执行的N维Delaunay三角剖分.然而,虽然Matlab函数给了我想要和期望的结果,但是scipy给了我不同的东西.考虑到两者都是QHull库的包装器,我发现这很奇怪.我假设Matlab在其调用中隐式设置了不同的参数.我试图在两者之间复制的情况可以在Matlab的文档中找到.
设置是在中心有一个点,如下所示.我提供的蓝线有助于形象化,但它们没有任何目的或意义.
我期望的三角测量结果是12个单纯形式(在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) 假设我有一个表单的 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)
我正在寻找一种速度相当快且可扩展的方法。我能想到的唯一方法是
x,作为一个新数组y。z,其中y删除了 from 的那些单个元素x,因此z是 中重复行的列表x。x和之间做一组差异z。但这似乎非常低效。有人有更好的方法吗?
如果这很重要,我保证我的每一行都会从小到大排序,这样你就永远不会有一行是[5, 2]or [3, 1]。
我有一个图应该查看范围内的整个数据集x = [-1,1]和y = [-1,1]. 当我在 matplotlib 中绘制它时,我可以用xlim([-1,1])和设置这个范围ylim([-1,1])。然后我可以玩弄该图,如果我愿意,可以放大某些功能,以便我的查看区域现在显示x = [-0.5,0.5]和y = [-0.5,0.5]. 但是,如果我打了工具栏上的主页按钮,它会返回我去xlim和ylim默认范围。
我希望发生的是,我想为 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。
当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)