我在 python 中创建了一个多维数组。它是一个大小为 (100,91) 的数组。
我需要创建一个子数组列表,具有预先指定的长度。
我需要以灵活的方式对其进行编码。数组数组的大小每次都在变化。
我的代码如下所示:
N=100
i=np.random.poisson(10,N)
v=np.random.uniform(0,200,sum(i))
r= np.vstack([v]*91).T
splitted_r=np.split(r,list(i),axis=1)
我期望创建子数组,每个子数组都有 i 中指示的行数。我怎样才能以最快的方式做到这一点?
我知道您想将数组拆分为
n
子数组,其中每个子数组的 length
(即第一维中的元素数)取决于泊松分布生成的相应数。
您可以通过使用
np.cumsum()
来识别每个拆分的索引,然后使用列表理解来执行拆分,从而获得非均匀拆分。下面的代码显示了如何做到这一点,我将 N
降低到 3,以便在 print
语句中获得结果,这些结果可以作为注释包含在代码中以显示它是如何工作的。
from copy import deepcopy
import numpy as np
# code from OP
N = 3
i = np.random.poisson(10,N)
print(i) # [9 5 7]
# based on generated lengths of subarrays, identify the respective indices using
# `np.cumsum()`; to identify the starting indices, a second cumsum list is created
# and all values are shifted to the right, adding 0 at the beginning
cumsum = np.cumsum(i).tolist()
cumsum_shifted = deepcopy(cumsum)
cumsum_shifted.insert(0, 0)
cumsum_shifted = cumsum_shifted[:-1]
print(cumsum) # [9, 14, 21]
print(cumsum_shifted) # [0, 9, 14]
# code from OP
v = np.random.uniform(0,200,sum(i))
r = np.vstack([v]*91).T
# split array into subarrays
splitted_r = np.asarray(
[r[i_css:i_cs] for i_css, i_cs in zip(cumsum_shifted, cumsum)],
dtype=object
)
print(f"Shapes of subarrays: {[r.shape for r in splitted_r]}")
# Shapes of subarrays: [(9, 91), (5, 91), (7, 91)]