1-数组拼接
np.concatenate
(concatenate意思是连接,连接的)是 NumPy 提供的用于连接两个或多个数组的函数。
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = np.concatenate((a, b))
print(result) # 输出: [1 2 3 4 5 6]
如果 a
和 b
是二维数组,要沿行方向(axis=0
)拼接:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
result = np.concatenate((a, b), axis=0)
print(result)
# 输出:
# [[1 2]
# [3 4]
# [5 6]
# [7 8]]
如果需要沿不同轴拼接:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
result = np.concatenate((a, b), axis=1)
print(result)
# 输出:
# [[1 2 5 6]
# [3 4 7 8]]
np.vstack(vertical stack)和
np.hstack(horizontal stack)
是 np.concatenate
的特殊情况
# 垂直拼接(沿行方向,相当于 axis=0)
result = np.vstack((a, b))
# 水平拼接(沿列方向,相当于 axis=1)
result = np.hstack((a, b))
2-理解 a[:, newaxis]
的作用
a[:, newaxis]
是 NumPy 中用于增加数组维度的一种操作。它通过插入一个长度为 1 的新轴(维度)来改变数组的形状
具体功能
假设 a
是一个一维数组,其形状为 (n,)
。执行 a[:, newaxis]
后,数组的形状变为 (n, 1)
。
如果是二维数组 a
的形状为 (m, n)
,则 a[:, newaxis]
会将其扩展为 (m, 1, n)
。
import numpy as np
# 一维数组示例
a = np.array([1, 2, 3])
print("原始形状:", a.shape) # 输出 (3,)
a_expanded = a[:, np.newaxis]
print("扩展后形状:", a_expanded.shape) # 输出 (3, 1)
print("扩展后数组:\n", a_expanded)
# 二维数组示例
b = np.array([[1, 2], [3, 4]])
print("原始形状:", b.shape) # 输出 (2, 2)
b_expanded = b[:, np.newaxis]
print("扩展后形状:", b_expanded.shape) # 输出 (2, 1, 2)
print("扩展后数组:\n", b_expanded)
则输出
原始形状: (3,)
扩展后形状: (3, 1)
扩展后数组:
[[1]
[2]
[3]]
原始形状: (2, 2)
扩展后形状: (2, 1, 2)
扩展后数组:
[[[1 2]]
[[3 4]]]
3-数组排序
arr = np.array([2, 1, 5, 3, 7, 4, 6, 8])
arr = np.sort(arr)
4-输入输出I/O
使用np.save()
将数组保存为.npy
文件:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
np.save('filename', a) # 保存为'filename.npy'
加载并翻转数组,使用np.load()
读取文件,并用np.flip()
反转数组顺序:
b = np.flip(np.load('filename.npy')) # 加载后翻转
print(b) # 输出:[6 5 4 3 2 1]
npy
是NumPy默认的二进制文件格式,保存时若不指定后缀会自动添加。
np.flip()
沿默认轴(一维数组的唯一轴)反转元素顺序。
完整示例
import numpy as np
# 创建并保存数组
a = np.array([1, 2, 3, 4, 5, 6])
np.save('filename', a)
# 加载并翻转
b = np.flip(np.load('filename.npy'))
print("Original:", a) # [1 2 3 4 5 6]
print("Flipped:", b) # [6 5 4 3 2 1]
使用 np.savetxt
将 NumPy 数组保存为 CSV 文件时,可以通过调整参数来控制输出格式。
import numpy as np
# 示例数据
b = np.array([[1, 2, 3], [4, 5, 6]])
# 保存为CSV,默认以科学计数法格式保存
np.savetxt('new_file.csv', b, delimiter=',', fmt='%f')
delimiter即分隔符的意思。
为 CSV 文件添加表头,可以结合 header
参数:
header = 'col1,col2,col3'
np.savetxt('new_file.csv', b, delimiter=',', fmt='%d', header=header, comments='')
5-np.genfromtxt
文件包含非数值列,用 np.genfromtxt
data = np.genfromtxt('new_file.csv', delimiter=',', names=True, dtype=None)
names=True
自动读取首行作为列名,dtype=None
自动推断数据类型。
缺失值处理
指定缺失值占位符:
data = np.genfromtxt('new_file.csv', delimiter=',', missing_values='NA', filling_values=np.nan)
6-掩码数组masked
os.path.join
os.path.join是 Python 标准库 os.path
模块中的一个方法,用于将多个路径组件拼接成一个完整的路径。该方法能够自动处理不同操作系统的路径分隔符(如 \
在 Windows,/
Linux/macOS),确保生成的路径格式正确。
import os
# 拼接路径
path = os.path.join("folder", "subfolder", "file.txt")
print(path) # 输出: "folder/subfolder/file.txt"(Linux/macOS)或 "folder\subfolder\file.txt"(Windows)
# 处理绝对路径
abs_path = os.path.join("/home/user", "documents", "report.pdf")
print(abs_path) # 输出: "/home/user/documents/report.pdf"
# 混合拼接
mixed_path = os.path.join("C:\\Users", "admin", "data.json")
print(mixed_path) # 输出: "C:\Users\admin\data.json"(Windows)
特点
-
自动处理分隔符
无需手动添加/
或\
,os.path.join
会根据当前操作系统选择正确的分隔符。 -
忽略多余分隔符
如果某个组件已包含分隔符(如folder/
),方法会智能处理,避免重复拼接。 -
绝对路径处理
如果某个组件是绝对路径(如/home
或C:\
),则之前的所有组件会被忽略,直接从该组件开始拼接。 -
空字符串忽略
空字符串组件会被自动忽略,不会影响路径拼接。
np.genfromtxt
np.genfromtxt
是 NumPy 中用于从文本文件加载数据的函数,支持处理缺失值、多种数据类型等复杂场景。以下是其主要参数及说明:
fname
指定输入文件路径或文件对象。可以是字符串(文件名)、文件句柄或生成器。
data = np.genfromtxt('data.txt')
dtype
指定输出数组的数据类型。默认为 float
,可设置为 int
、str
等或自定义类型。
data = np.genfromtxt('data.txt', dtype=int)
delimiter
定义分隔符。默认为 None
(自动检测),可指定为逗号 ,
、空格 等。
data = np.genfromtxt('data.csv', delimiter=',')
skip_header
跳过文件开头的行数。适用于忽略标题行。
data = np.genfromtxt('data.txt', skip_header=1)
skip_footer
跳过文件末尾的行数。适用于忽略注释行。
data = np.genfromtxt('data.txt', skip_footer=2)
usecols
选择读取的列索引或切片。可以是整数列表或元组。
data = np.genfromtxt('data.txt', usecols=(0, 2))
filling_values
指定缺失值的填充值。默认将缺失值替换为 np.nan
。
data = np.genfromtxt('data.txt', filling_values=0)
names
为列命名,生成结构化数组。可传入字符串列表或 True
(自动从首行读取)。
data = np.genfromtxt('data.txt', names=['a', 'b', 'c'])
autostrip
自动去除字符串数据的前后空格。默认为 False
。
data = np.genfromtxt('data.txt', dtype=str, autostrip=True)
encoding
指定文件编码(如 'utf-8'
)。处理非 ASCII 文件时可能需要。
data = np.genfromtxt('data.txt', encoding='utf-8')
掩码数组用法
import numpy as np
# 创建掩码数组
data = np.array([1, 2, -999, 4, -999]) # 用-999表示缺失值
masked_data = np.ma.masked_where(data == -999, data)
print("原始数据:", data)
print("掩码数组:", masked_data) # 输出: [1 2 -- 4 --]
print("有效数据:", masked_data.compressed()) # 输出: [1 2 4]
使用 np.ma.masked_where
进行数组掩码
np.ma.masked_where
是 NumPy 的掩码数组模块中的一个函数,用于根据条件掩码数组中的元素。掩码后的元素在计算中会被忽略。
numpy.ma.masked_where(condition, arr, copy=True)
condition
:布尔条件,满足条件的元素会被掩码。arr
:输入数组。copy
:是否返回掩码数组的副本(默认为True
)。
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
masked_arr = np.ma.masked_where(arr > 3, arr)
print(masked_arr)
输出:
[1 2 3 -- --]
满足 arr > 3
的元素被掩码(显示为 --
)。