Python 将列表重塑为 ndim 数组

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

嗨,我有一个长度为 2800 的平面列表,它包含 28 个变量中每个变量的 100 个结果:下面是 2 个变量的 4 个结果的示例

[0,
 0,
 1,
 1,
 2,
 2,
 3,
 3]

我想将列表重塑为数组 (2,4),以便每个变量的结果都在单个元素中。

[[0,1,2,3],
 [0,1,2,3]]
python numpy reshape
5个回答
47
投票

您可以考虑重塑新形状,从展平的原始列表/数组中逐行填充(最后一个维度变化最快)。

如果您想按列填充数组,一个简单的解决方案是将列表整形为具有相反维度的数组,然后转置它:

x = np.reshape(list_data, (100, 28)).T

上面的代码片段生成一个 28x100 数组,按列填充。

为了说明这一点,以下是将列表整形为 2x4 数组的两个选项:

np.reshape([0, 0, 1, 1, 2, 2, 3, 3], (4, 2)).T
# array([[0, 1, 2, 3],
#        [0, 1, 2, 3]])

np.reshape([0, 0, 1, 1, 2, 2, 3, 3], (2, 4))
# array([[0, 0, 1, 1],
#        [2, 2, 3, 3]])

3
投票

您可以使用

order
参数指定轴的解释顺序:

np.reshape(arr, (2, -1), order='F')

2
投票

一步一步:

# import numpy library
import numpy as np
# create list
my_list = [0,0,1,1,2,2,3,3]
# convert list to numpy array
np_array=np.asarray(my_list)
# reshape array into 4 rows x 2 columns, and transpose the result
reshaped_array = np_array.reshape(4, 2).T 

#check the result
reshaped_array
array([[0, 1, 2, 3],
       [0, 1, 2, 3]])

1
投票

上面的答案都很好。补充一个我用过的案例。 只是如果您不想使用 numpy 并将其保留为列表而不更改内容。

您可以运行一个小循环并将尺寸从 1xN 更改为 Nx1。

    tmp=[]
    for b in bus:
        tmp.append([b])
    bus=tmp

在数量非常大的情况下,它可能效率不高。但它适用于少量数字。 谢谢


0
投票

如果有人感兴趣,有一种方法可以使用列表理解对任何可迭代对象进行更普遍的操作。即使一维可迭代中的基本元素数量不能被分区(子列表)的长度整除:

linear = 'doorcoresoremoreloreforescore'
N = 4 # length of sublists after partitioning 
partitioned = [linear [i*N:(i+1)*N] for i in range(round(len(linear_list)/N))]

>> ['door', 'core', 'sore', 'more', 'lore', 'fore', 'scor']

注意字符串中的最后一个单词有 5 个字母,但只显示前 4 个字母,并且不会引发错误。如果您确定元素的数量可以被子列表的长度整除,那么这不是问题。如果您使用

numpy.array
,如果无法均匀地进行重塑,它总是会引发错误,因为 numpy 数组不允许可变长度的子数组。

在其他情况下,您无法确定元素数量始终可以被均匀分割,此解决方案可能有其优势。但您需要小心并确保您了解最终结果。

© www.soinside.com 2019 - 2024. All rights reserved.