numpy python中的拆分多维数组

vcirk6k6  于 2023-05-22  发布在  Python
关注(0)|答案(1)|浏览(238)

我在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中指示的行数。我怎样才能以最快的方式做到这一点?

icnyk63a

icnyk63a1#

我知道你想把数组拆分成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)]

相关问题