【问题标题】:ValueError: x and y must have same first dimension, but have shapes (50,) and (1, 50)/ MultiprocessingValueError: x 和 y 必须具有相同的第一维,但具有形状 (50,) 和 (1, 50)/ 多处理
【发布时间】:2020-10-04 14:40:46
【问题描述】:

我是多处理和绘图的新手,所以我希望编写一个代码,可以对一系列高度进行多处理,以通过方程式获得每个高度的最佳发射角度,然后绘制结果。

我的主要问题是在尝试绘制结果时遇到错误。我的次要问题是通过调查我的代码一段时间,现在我开始认为多进程是多余的?我仍然希望使用多进程。因此,对此的任何帮助也将不胜感激。

当我不想绘制结果时,该等式似乎可以正常工作。但是当我尝试绘制它们时,我得到“ValueError:x 和 y 必须具有相同的第一维,但具有我不完全理解的形状 (50,) 和 (1, 50)”。我以为它们都只是 50 的范围?

我已经搞砸了一段时间试图让它工作。我相信它在 “list_h = np.array(range(1))” 行,因为它看起来不正确。但如果我增加它,这个范围似乎只是重复结果。导致我认为我对这个多进程的结构很糟糕。

我的代码如下

import numpy as np
from multiprocessing import Pool
import matplotlib.pyplot as plt

def f(x):
    speed = 5
    ran0 = (speed*speed)/9.8
    array_hght = np.array(range(50))
    return ((np.arccos(array_hght/(array_hght+ran0)))/2)*(180/np.pi)

if __name__ == '__main__':
    with Pool(5) as p:
        list_h = np.array(range(1))
        list_angles = p.map(f, list_h)
        print(list_angles)
        array_h = np.array(range(50))
        plt.plot(array_h, list_angles)
        plt.show()

非常感谢任何帮助:)。

【问题讨论】:

    标签: python matplotlib multiprocessing valueerror


    【解决方案1】:

    你快到了!! pool.map() 方法通过将f 应用于给定输入(在本例中为list_h)以列表形式返回结果。由于list_h 只有一项,所以结果将是一个只有一个值的列表。

    所以,您需要做的就是从list_angles 获取第一个元素,如下所示:

    if __name__ == '__main__':
        with Pool(5) as p:
            list_h = np.array(range(1))
            list_angles = p.map(f, list_h)[0]    #<--- HERE
            array_h = np.array(range(50))
            print(array_h.shape)
            plt.plot(array_h, list_angles)
            plt.show()
    

    运行前面的代码会得到下图:

    【讨论】:

      猜你喜欢
      • 2020-05-21
      • 2018-12-04
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2023-03-24
      相关资源
      最近更新 更多