如何将 Numpy 数组转换为列表
在数据处理和科学计算中,Numpy 是 Python 中最流行的库之一。Numpy 提供了一个强大的对象 ndarray(N-dimensional array),用于有效地处理大型数组和矩阵。然而,在某些情况下,我们可能需要将 Numpy 数组转换为 Python 的标准列表格式。这可能是因为某些 Python 库或函数只接受列表作为输入,或者我们可能需要将数据输出到可读性更强的格式。
本文将详细介绍如何将 Numpy 数组转换为列表,包括不同形状和数据类型的数组。我们将通过多个示例代码来展示不同的转换方法和技巧。
1. 使用 tolist()
方法
Numpy 数组对象有一个非常方便的方法 tolist()
,该方法可以将数组转换为嵌套列表。这是最直接的方法。
示例代码 1: 将一维数组转换为列表
import numpy as np
# 创建一个一维 numpy 数组
array_1d = np.array([1, 2, 3, 4, 5])
# 使用 tolist() 方法转换为列表
list_1d = array_1d.tolist()
print(list_1d) # 输出: [1, 2, 3, 4, 5]
Output:
示例代码 2: 将二维数组转换为列表
import numpy as np
# 创建一个二维 numpy 数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 使用 tolist() 方法转换为列表
list_2d = array_2d.tolist()
print(list_2d) # 输出: [[1, 2, 3], [4, 5, 6]]
Output:
示例代码 3: 将三维数组转换为列表
import numpy as np
# 创建一个三维 numpy 数组
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 使用 tolist() 方法转换为列表
list_3d = array_3d.tolist()
print(list_3d) # 输出: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
Output:
2. 使用列表推导式
虽然 tolist()
方法非常方便,但在某些复杂的转换场景中,我们可能需要更多的控制,比如转换过程中的数据类型转换或条件过滤。这时,列表推导式就显得非常有用。
示例代码 4: 使用列表推导式转换一维数组
import numpy as np
# 创建一个一维 numpy 数组
array_1d = np.array([1, 2, 3, 4, 5])
# 使用列表推导式转换为列表
list_1d = [x for x in array_1d]
print(list_1d) # 输出: [1, 2, 3, 4, 5]
Output:
示例代码 5: 使用列表推导式转换二维数组并进行条件过滤
import numpy as np
# 创建一个二维 numpy 数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 使用列表推导式转换为列表,只包含大于 3 的元素
list_2d = [[x for x in row if x > 3] for row in array_2d]
print(list_2d) # 输出: [[], [4, 5, 6]]
Output:
3. 使用 np.ndarray.flatten()
方法
当我们需要将多维数组转换为一维列表时,flatten()
方法是一个非常有用的工具。它可以将任何形状的数组“压平”成一维数组,然后我们可以轻松地将其转换为列表。
示例代码 6: 将二维数组压平并转换为列表
import numpy as np
# 创建一个二维 numpy 数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 使用 flatten() 方法压平数组,然后转换为列表
list_flat = array_2d.flatten().tolist()
print(list_flat) # 输出: [1, 2, 3, 4, 5, 6]
Output:
示例代码 7: 将三维数组压平并转换为列表
import numpy as np
# 创建一个三维 numpy 数组
array_3d = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# 使用 flatten() 方法压平数组,然后转换为列表
list_flat = array_3d.flatten().tolist()
print(list_flat) # 输出: [1, 2, 3, 4, 5, 6, 7, 8]
Output:
4. 使用 np.concatenate()
方法
当我们有多个数组需要首先合并再转换为列表时,np.concatenate()
方法可以帮助我们。这个方法可以将一个数组列表合并成一个单一的数组。
示例代码 8: 合并多个一维数组并转换为列表
import numpy as np
# 创建几个一维 numpy 数组
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
array3 = np.array([7, 8, 9])
# 使用 np.concatenate() 方法合并数组
combined_array = np.concatenate((array1, array2, array3))
# 转换为列表
combined_list = combined_array.tolist()
print(combined_list) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Output:
示例代码 9: 合并多个二维数组并转换为列表
import numpy as np
# 创建几个二维 numpy 数组
array1 = np.array([[1, 2], [3, 4]])
array2 = np.array([[5, 6], [7, 8]])
# 使用 np.concatenate() 方法合并数组,指定 axis=0 以沿着第一个轴合并
combined_array = np.concatenate((array1, array2), axis=0)
# 转换为列表
combined_list = combined_array.tolist()
print(combined_list) # 输出: [[1, 2], [3, 4], [5, 6], [7, 8]]
Output:
5. 使用 np.hstack()
和 np.vstack()
方法
np.hstack()
和 np.vstack()
方法提供了另一种合并数组的方式。np.hstack()
水平堆叠数组,而 np.vstack()
垂直堆叠数组。这些方法特别适用于需要保持数组维度的场景。
示例代码 10: 使用 np.hstack() 水平堆叠数组并转换为列表
import numpy as np
# 创建几个一维 numpy 数组
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
# 使用 np.hstack() 方法水平堆叠数组
stacked_array = np.hstack((array1, array2))
# 转换为列表
stacked_list = stacked_array.tolist()
print(stacked_list) # 输出: [1, 2, 3, 4, 5, 6]
Output:
示例代码 11: 使用 np.vstack() 垂直堆叠数组并转换为列表
import numpy as np
# 创建几个一维 numpy 数组
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
# 使用 np.vstack() 方法垂直堆叠数组
stacked_array = np.vstack((array1, array2))
# 转换为列表
stacked_list = stacked_array.tolist()
print(stacked_list) # 输出: [[1, 2, 3], [4, 5, 6]]
Output:
6. 使用 np.array_str()
和 np.array_repr()
方法
当我们需要将 numpy 数组转换为字符串表示的列表时,np.array_str()
和 np.array_repr()
方法非常有用。这些方法返回数组的字符串表示,我们可以使用 Python 的 eval()
函数将其转换为列表。
示例代码 12: 使用 np.array_str() 转换为字符串表示的列表
import numpy as np
# 创建一个一维 numpy 数组
array_1d = np.array([1, 2, 3, 4, 5])
# 使用 np.array_str() 方法获取数组的字符串表示
array_str = np.array_str(array_1d)
# 使用 eval() 函数将字符串转换为列表
list_1d = eval(array_str)
print(list_1d) # 输出: [1, 2, 3, 4, 5]
示例代码 13: 使用 np.array_repr() 转换为字符串表示的列表
import numpy as np
# 创建一个二维 numpy 数组
array_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 使用 np.array_repr() 方法获取数组的字符串表示
array_repr = np.array_repr(array_2d)
# 使用 eval() 函数将字符串转换为列表
list_2d = eval(array_repr)
print(list_2d) # 输出: [[1, 2, 3], [4, 5, 6]]
7. 使用 np.char.join()
方法
当我们需要将字符串类型的 numpy 数组转换为列表时,np.char.join()
方法可以帮助我们。这个方法可以将每个元素连接成一个字符串,然后我们可以使用 Python 的 split()
方法将其转换为列表。
示例代码 14: 使用 np.char.join() 转换为字符串列表
import numpy as np
# 创建一个字符串类型的 numpy 数组
array_str = np.array(['numpyarray.com', 'is', 'awesome'])
# 使用 np.char.join() 方法连接数组元素
joined_str = np.char.join(' ', array_str)
# 使用 split() 方法将字符串转换为列表
list_str = joined_str.tolist().split()
print(list_str) # 输出: ['numpyarray.com', 'is', 'awesome']
8. 使用 np.apply_along_axis()
方法
当我们需要对数组的每个元素应用一个函数并将结果转换为列表时,np.apply_along_axis()
方法非常有用。这个方法可以沿着指定的轴应用一个函数。
示例代码 15: 使用 np.apply_along_axis() 应用函数并转换为列表
import numpy as np
# 创建一个一维 numpy 数组
array_1d = np.array([1, 2, 3, 4, 5])
# 定义一个函数,将每个元素加倍
def double(x):
return x * 2
# 使用 np.apply_along_axis() 方法应用函数
applied_array = np.apply_along_axis(double, 0, array_1d)
# 转换为列表
list_1d = applied_array.tolist()
print(list_1d) # 输出: [2, 4, 6, 8, 10]
Output:
9. 使用 np.vectorize()
方法
np.vectorize()
方法提供了一种将函数向量化的方式,使得函数可以直接应用于数组的每个元素。然后我们可以将结果转换为列表。
示例代码 16: 使用 np.vectorize() 向量化函数并转换为列表
import numpy as np
# 创建一个一维 numpy 数组
array_1d = np.array([1, 2, 3, 4, 5])
# 定义一个函数,将每个元素加倍
def double(x):
return x * 2
# 使用 np.vectorize() 方法向量化函数
vec_double = np.vectorize(double)
# 应用向量化函数
applied_array = vec_double(array_1d)
# 转换为列表
list_1d = applied_array.tolist()
print(list_1d) # 输出: [2, 4, 6, 8, 10]
Output:
10. 使用 np.ndenumerate()
方法
当我们需要在转换为列表的同时保留数组元素的索引时,np.ndenumerate()
方法非常有用。这个方法返回一个迭代器,产生数组的索引和对应的值。
示例代码 17: 使用 np.ndenumerate() 保留索引并转换为列表
import numpy as np
# 创建一个一维 numpy 数组
array_1d = np.array([1, 2, 3, 4, 5])
# 使用 np.ndenumerate() 方法获取索引和值
list_1d = [(index, value) for index, value in np.ndenumerate(array_1d)]
print(list_1d) # 输出: [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)]
Output:
总结,Numpy 提供了多种方法将数组转换为列表,包括 tolist()
方法、列表推导式、flatten()
方法、concatenate()
方法、hstack()
和 vstack()
方法、array_str()
和 array_repr()
方法、char.join()
方法、apply_along_axis()
方法、vectorize()
方法以及 ndenumerate()
方法。这些方法可以满足我们在不同场景下的转换需求。