首页 > 解决方案 > 如何将 2D numpy 数组的 2D numpy 数组重组为 4D 浮点数组?

问题描述

我目前有一个问题,我有一个形状为 (60,60) 的 numpy 数组,其中每个点本身就是一个形状为 (11,11) 的 numpy 数组。这给我带来了问题,因为 (60,60) 数组的每个点都是一个对象而不是浮点数:

    P_arr.shape
    (60,60)
    P_arr[i,j].shape
    (11,11)
    P_arr[i,j][k,l]
    1.0

对于稍后需要执行的矩阵运算,我需要以特定顺序访问数组的每个浮点值。我需要一个新数组的形状为(11,11,60,60),每个点都是一个浮点数。理想情况下,我想达到这一点:

    New_P_arr[k,l,i,j]
    1.0

有没有办法从内部二维数组中提取浮点值以将其重塑为所需的形式?我需要一个比循环更快的解决方案,因为这在未来会扩大很多。我尝试过扁平化、vstack、连接等。扁平化的问题是这样的:

    New_P_arr = np.concatenate(P_arr)
    New_P_arr.shape
    (3600,)
    New_P_arr[i].shape
    (11,11)

因此,展平数组(或其他操作)将不允许我访问单个方括号索引中的所有值。我最初的想法是展平数组以重塑它,但因为这些点是对象而不是浮动,所以也不起作用。

编辑:这是我生成 P_arr 的方式。我需要求解相关的勒让德函数,以便在形状为 (60,60) 的 theta 值网格上选择 11 l 和 11 m 值。Scipy 有一个包 lpmn,它计算相关的勒让德多项式及其导数(我不需要),但它不是矢量化的。它返回一个 (11,11) 数组,每个 l 和 m 的给定 theta 值直到我输入的值(从 0-10,这就是 11 的来源)。这是代码:

    import numpy as np
    from scipy.special import lpmn
    lmax = 10
    mmax = lmax
    theta = np.arange(0, 180., 3)
    theta = theta*np.pi/180.
    phi = theta
    ph, th = np.meshgrid(theta, phi)
    cos_th = np.cos(th)
    th is a (60,60) array of theta values from 0-pi in equal steps    

    @np.vectorize
    def asscP(m, l, cos_theta):
        return lpmn(m, l, cos_theta)[0]

    asscP = np.vectorize(asscP, excluded={0,1}, otypes=[np.ndarray])
    P_arr = asscP(mmax, lmax, cos_th)

标签: pythonarraysnumpy

解决方案


  • 您可以先堆叠内层,然后再堆叠外层。
>>>new_P_arr = np.stack([np.stack(p) for x in P_arr])
>>>new_P_arr.shape
(60,60,11,11)

推荐阅读