我有两个大小的矢量:
A = (32,512,640)
B = (4,512)
Run Code Online (Sandbox Code Playgroud)
我需要将A和B相乘,以便得到一个新的向量:
C = (4,32,512,640)
Run Code Online (Sandbox Code Playgroud)
另一种思考方式是矢量B的每一行沿着A的轴= -2相乘,这导致新的1,32,512,640立方体.B行的每一行可以循环形成1,32,512,640个立方体,然后可以通过使用np.concatenate或者使用它来构建C up np.vstack,例如:
# Sample vectors, where the dimensions aren't necessarily known
a = np.arange(32*512*465, dtype='f4').reshape((32,512,465))
b = np.ones((4,512), dtype='f4')
# Using a loop
d = []
for row in b:
d.append(np.expand_dims(row[None,:,None]*a, axis=0))
# Or using list comprehension
d = [np.expand_dims(row[None,:,None]*a,axis=0) for row in b]
# Stacking the final list
result = np.vstack(d)
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有可能使用类似的东西np.einsum或np.tensordot将这个矢量化全部放在一行中.我还在学习如何使用这两种方法,所以我不确定它是否合适.
谢谢!
我希望在未来完成后添加回调。
根据文档:
当回调完成时,调用未来的回调。
回调 fn 应该将 future 作为其唯一的参数。无论 future 是否成功完成、出错或被取消,都会调用此函数。
回调在单独的线程中执行。
这并没有为我提供我需要的东西,因为回调 fn 需要将 future 作为其唯一的参数。
这是我要做的事情的示例部分代码:
def method(cu_device_id):
print("Hello world, I'm going to use GPU %i" % cu_device_id)
def callback_fn(cu_device_id)
gpu_queue.put(cu_device_id)
cu_device_id = gpu_queue.get()
future = client.submit(method, cu_device_id)
#gpu_queue.put(cu_device_id) # Does not work, clients will shortly end up piled onto the slowest GPU
result.add_done_callback(callback_fn) # Crash / no way to pass in cu_device_id
Run Code Online (Sandbox Code Playgroud)
这里的想法是让客户端从队列中获取可用的 GPU,然后在使用完毕后将其放回到队列中,以便另一个客户端可以使用它。
解决这个问题的一种方法是将 gpu_queue 传递给客户端:
def method(gpu_queue):
cu_device_id = gpu_queue.get()
print("Hello world, I'm going to use …Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
void func(void *data, const int dtype)
{
typedef typename std::conditional<dtype==0,float,double>::type DataType;
funcT((DataType *)data);
return;
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为dtype需要在编译时知道.我试图避免使用switch语句,因为我正在使用8个数据类型,有许多函数,如上面的那些,通过ctypes从Python调用.
有没有像std :: conditional这样的方法可以在运行时完成,利用传入的dtype标识符?