在 python 中拆分多维数组

问题描述 投票:0回答:1

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

python arrays numpy multidimensional-array split
1个回答
0
投票

我知道您想将数组拆分为

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)]
© www.soinside.com 2019 - 2024. All rights reserved.