Python将列表重塑为ndim数组

Posted

技术标签:

【中文标题】Python将列表重塑为ndim数组【英文标题】:Python reshape list to ndim array 【发布时间】:2016-05-27 17:18:56 【问题描述】:

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

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

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

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

【问题讨论】:

您提供的示例不一致:(1)您无法将具有 8 个元素的列表重塑为 2x2 数组。 (2) np.shape = (28, 100) 应该做什么? 【参考方案1】:

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

一个简单的解决方案是将列表整形为 (100, 28) 数组,然后对其进行转置:

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

关于更新示例的更新:

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]])

【讨论】:

我使用了这个解决方案,但是当列表的大小不是列数的倍数时遇到了问题。我的解决方案是在列表中添加空项,使用“+”进行列表连接。为了计算要添加的元素数量,我做了newlist = list+(c-N%c)*[""],其中c 是列数,N 是列表的长度。对于数字(同构)数组,您可以使用 ["0"] 而不是 [""] @HugoCavalcante 对于c - N%c,如果列表大小是列号的精确倍数,它将添加一整行。您可以改用(-N)%c 来避免这种情况。【参考方案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]])

【讨论】:

【参考方案3】:

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

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

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

如果数字很大,它可能效率不高。但它适用于一小组数字。 谢谢

【讨论】:

【参考方案4】:

您可以使用order 参数指定轴的解释顺序:

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

【讨论】:

以上是关于Python将列表重塑为ndim数组的主要内容,如果未能解决你的问题,请参考以下文章

在python中重塑图像矩阵

如何将 4D numpy 数组重塑为 3D 数组

什么是数组的维度,python 的ndim的使用

使用元组列表重塑数组时出现 mypy 错误

什么是数组的维度,python 的ndim的使用

如何在python中重塑数组? [复制]