python - 如何将 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)
解决方案
- 您可以先堆叠内层,然后再堆叠外层。
>>>new_P_arr = np.stack([np.stack(p) for x in P_arr])
>>>new_P_arr.shape
(60,60,11,11)
推荐阅读
- python - 如何在使用 Fernet 时检查密钥是否已加密
- highcharts - Highcharts 地图气泡轮廓未正确显示
- javascript - 我的 express js api 无法读取我的给定属性
- histogram - 具有提升直方图的经验概率
- asp.net-core - 工作人员服务未在 Visual Studio 2019 中显示
- c - C中的全局变量地址
- groovy - 如何使用 jsonbuilder 来制作一个 json,它的键名为 DefaultGroovyMethods 方法(身份)?
- r - 仅将 Group 保留在 df1 中,这些 Group 存在于另一个 df 中,但有例外
- postgresql - Postgres COPY - 错误:行太大:大小 8216,最大大小 8160
- python - 如何从Python中每行的特定值获取列名