如果我有一个肯定的ndarray,dtype我怎么知道相应的ctypes类型是什么?
例如,如果我有一个ndarray,我可以执行以下操作将其转换为共享数组:
import multiprocessing as mp
import numpy as np
import ctypes
x_np = np.random.rand(10, 10)
x_mp = mp.Array(ctypes.c_double, x_np)
Run Code Online (Sandbox Code Playgroud)
但是,我必须在c_double这里指明.如果我没有指定完全相同的类型,它可以工作,但我想保持类型相同.我应该如何x_np自动找出ndarray的ctypes类型,至少对于一些常见的基本数据类型?
我是否可以拥有一个偶尔不会产生的上下文管理器,在这种情况下,with语句中的代码根本不会被执行?
import contextlib
@contextlib.contextmanager
def MayNotYield(to_yield):
if to_yield:
yield
with MayNotYield(True):
print 'This works.'
with MayNotYield(False):
print 'This errors.'
Run Code Online (Sandbox Code Playgroud)
我可以要求用户使用try-catch包装with语句,但这不是首选.我也可以做以下但它也很难看.
import contextlib
@contextlib.contextmanager
def AlwaysYields(to_yield):
if to_yield:
yield 1
else:
yield 2
with AlwaysYields(True) as result:
if result == 1:
print 'This works.'
Run Code Online (Sandbox Code Playgroud) 我想编写一个函数来接收本地命名空间字典并更新它。像这样的东西:
def UpdateLocals(local_dict):
d = {'a':10, 'b':20, 'c':30}
local_dict.update(d)
Run Code Online (Sandbox Code Playgroud)
当我从交互式 python shell 调用这个函数时,它工作正常,如下所示:
a = 1
UpdateLocals(locals())
# prints 20
print a
Run Code Online (Sandbox Code Playgroud)
但是,当我UpdateLocals从函数内部调用时,它不会执行我期望的操作:
def TestUpdateLocals():
a = 1
UpdateLocals(locals())
print a
# prints 1
TestUpdateLocals()
Run Code Online (Sandbox Code Playgroud)
我怎样才能使第二个案例像第一个案例一样工作?
更新:
Aswin的解释很有道理,对我很有帮助。但是我仍然想要一种更新局部变量的机制。在找到一种不太丑陋的方法之前,我将执行以下操作:
def LoadDictionary():
return {'a': 10, 'b': 20, 'c': 30}
def TestUpdateLocals():
a = 1
for name, value in LoadDictionary().iteritems():
exec('%s = value' % name)
Run Code Online (Sandbox Code Playgroud)
当然,字符串语句的构造可以自动化,并且可以对用户隐藏细节。
我想在多个进程之间共享numpy数组.有工作的解决方案在这里.但是它们都通过继承将数组传递给子进程,这对我来说不起作用,因为我必须事先启动一些工作进程,而且我不知道稍后我要处理多少个数组.有没有办法在进程启动后创建这样的数组并通过队列将这些数组传递给进程?
顺便说一下,我无法使用multiprocessing.Manager.
我对在视图上操作的numpy reshape的结果感到困惑.在下面的q.flags中显示它不拥有数据,但q.base既不是x也不是y,那么它是什么?我很惊讶地看到q.strides是8,这意味着它每次在内存中移动8个字节时获得下一个元素(如果我理解正确的话).但是,如果x以外的数组都没有数据,则唯一的数据缓冲区来自x,它不允许通过移动8个字节来获取q的下一个元素.
In [99]: x = np.random.rand(4, 4)
In [100]: y = x.T
In [101]: q = y.reshape(16)
In [102]: q.base is y
Out[102]: False
In [103]: q.base is x
Out[103]: False
In [104]: y.flags
Out[104]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [105]: q.flags
Out[105]:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [106]: q.strides
Out[106]: …Run Code Online (Sandbox Code Playgroud) 如果我有a numpy.ndarray A和a scipy.sparse.csc_matrix B,我怎么拿A点B?我可以做B点A说B.dot(A),但其他办法,我只能想到这一点:
B.T.dot(A.T).T
Run Code Online (Sandbox Code Playgroud)
有没有更直接的方法来做到这一点?
如果我从主机内存到主机内存调用 cudaMemcpy,它会先同步设备吗?cuda memcpy调用和普通的C++函数memcpy有什么区别吗?我知道如果我想在主机到主机之间执行 memcpy 2D,我必须使用 cuda 调用,因为 C++ 中没有这样的函数。还有其他的吗?
使用 cub::BlockRadixSort 在块内排序时,如果元素数量过多,我们该如何处理?如果我们将切片大小设置得太大,临时存储的共享内存很快就无法容纳它。如果我们将其拆分为多个图块,那么在对每个图块进行排序后如何对其进行后处理?