标准的 Python 列表类型可以用一个列表的列表来表示一个二维数组。
本节解释如何交换这个二维数组的行和列。
- 转换为NumPy数组
.T
用这个移位。
pandas.DataFrame
转换到这个.T
用这个移位。
- 用内置函数zip()进行移位
使用NumPy或pandas更容易,但如果你不想仅仅为了转置而导入NumPy或pandas,你可以使用zip()函数来转置。
原始的二维数组定义如下
import numpy as np
import pandas as pd
l_2d = [[0, 1, 2], [3, 4, 5]]
转换为NumPy数组ndarray,并用.T转置。
从原始的二维数组中生成一个NumPy数组ndarray,并通过.T属性得到转置的对象。
如果你最后想要一个 Python 列表类型的对象,进一步用 tolist() 方法将其转换为一个列表。
arr_t = np.array(l_2d).T
print(arr_t)
print(type(arr_t))
# [[0 3]
# [1 4]
# [2 5]]
# <class 'numpy.ndarray'>
l_2d_t = np.array(l_2d).T.tolist()
print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>
除了.T属性外,还可以使用ndarray方法transpose()和函数numpy.transpose()。
转换成pandas.DataFrame,并用.T转置。
从原始的二维数组中生成一个pandas.DataFrame,并通过.T属性获得转置的对象。
如果你最后想要一个Python列表类型的对象,可以用values属性得到numpy.ndarray,然后用tolist()方法将其转换为一个列表。
df_t = pd.DataFrame(l_2d).T
print(df_t)
print(type(df_t))
# 0 1
# 0 0 3
# 1 1 4
# 2 2 5
# <class 'pandas.core.frame.DataFrame'>
l_2d_t = pd.DataFrame(l_2d).T.values.tolist()
print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>
用内置函数zip()进行移位
使用内置函数zip()对一个二维数组进行移位。
zip()是一个返回迭代器的函数,它概括了多个迭代器(列表、图元等)的元素。例如,当在一个for循环中运行多个列表时,它就被使用。
此外,该函数使用了一种机制,如果函数参数被标记为星号,则列表可以被展开并传递。
可按以下方式进行转置。
l_2d_t_tuple = list(zip(*l_2d))
print(l_2d_t_tuple)
print(type(l_2d_t_tuple))
# [(0, 3), (1, 4), (2, 5)]
# <class 'list'>
print(l_2d_t_tuple[0])
print(type(l_2d_t_tuple[0]))
# (0, 3)
# <class 'tuple'>
因为它是,里面的元素是元组。因此,如果你想把它变成一个列表,请使用list(),它可以把一个元组转换为列表理解符号的列表。
l_2d_t = [list(x) for x in zip(*l_2d)]
print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>
print(l_2d_t[0])
print(type(l_2d_t[0]))
# [0, 3]
# <class 'list'>
以下是对这一过程的逐步分解。
列表中的元素用星号扩展,扩展后的元素用zip()函数分组,然后用列表理解符号将元组转换为一个列表。
print(*l_2d)
# [0, 1, 2] [3, 4, 5]
print(list(zip([0, 1, 2], [3, 4, 5])))
# [(0, 3), (1, 4), (2, 5)]
print([list(x) for x in [(0, 3), (1, 4), (2, 5)]])
# [[0, 3], [1, 4], [2, 5]]