【问题标题】:Is there a way to Send (capital) list of string by using Mpi4py有没有办法使用 Mpi4py 发送(大写)字符串列表
【发布时间】:2023-04-01 07:17:01
【问题描述】:

这是我的排名 0 的数据集,我想在将其转换为 NumPy 数组后使用 Send 将其发送到另一个排名。

data = [['zzz', '2', '-1'], ['xxx', '5', '-99'], ['zzz', '2', '-1']]

我在转换为 NumPy 数组时尝试了很多字符串数据类型,但都不起作用。

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

if rank == 0:
    data = [['zzz', '2', '-1'], ['xxx', '5', '-99'], ['zzz', '2', '-1']]
    data_arr = np.array(data, dtype='S13')
    comm.Send(data, dest=1, tag=10)
else:
    data_arr = np.empty(shape=(3,3),dtype='S13')
    comm.Recv(data_arr, source=0, tag=10)

我知道 send 和 recv(下)可以处理这个问题,但我仍然想知道是否可以使用 Send 和 Recv 传递数组或字符串列表。

非常感谢!

【问题讨论】:

  • 为什么是c 标签?请不要发送不相关的标签。
  • @Julien 感谢您的通知,我认为将 Python 中的字符串转换为 C char 可能是一种解决方案。
  • 为什么是数组而不是列表?
  • @hpaulj 根据 Mpi4py 的文档,NumPy 数组是更快的方式。

标签: python numpy numpy-ndarray mpi4py


【解决方案1】:

我问了这个问题的单字符串版本,得到了很好的答案:mpi4py Send characters

也许您可以使用分隔符构建一个更大的字符串,将其作为单个字符串发送并稍后拆分?不理想但实用。

【讨论】:

    【解决方案2】:

    您可以使用将 numpy 数组转换为字节,将其发送过来,然后将其转换回 numpy 数组。

    一些细微差别是您需要知道数组的形状和 dtype 才能成功转换它。根据您的示例,解决方案可能是:

    import numpy as np
    
    from mpi4py import MPI
    
    comm = MPI.COMM_WORLD
    rank = comm.Get_rank()
    size = comm.Get_size()
    
    if rank == 0:
        data = [['zzz', '2', '-1'], ['xxx', '5', '-99'], ['zzz', '2', '-1']]
        data_arr = np.array(data, dtype='S13')
        # Transform the data to bytes and send it
        comm.Send(data_arr.tobytes(),dest=1)
    else:
        # Initialize a bytearray big enough to fit our message
        data_arr = bytearray(500)
        comm.Recv(data_arr, source=0)
        data_arr = np.frombuffer(data_arr, dtype='S13', count=9)
        data_arr = data_arr.reshape((3, 3))
        print(data_arr)
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 2023-03-31
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 2017-10-11
      相关资源
      最近更新 更多