当前位置: 代码网 > it编程>前端脚本>Python > Python NumPy实现将数组保存为.npy格式

Python NumPy实现将数组保存为.npy格式

2026年09月03日 Python 我要评论
在科学计算和数据分析的世界中,numpy 作为 python 生态系统中的核心库之一,为我们提供了强大的多维数组操作能力。当我们处理大量数据时,如何高效地保存和加载这些数组就成为了一个重要的问题。nu

在科学计算和数据分析的世界中,numpy 作为 python 生态系统中的核心库之一,为我们提供了强大的多维数组操作能力。当我们处理大量数据时,如何高效地保存和加载这些数组就成为了一个重要的问题。numpy 提供了多种数据存储格式,其中 .npy 格式是专门为 numpy 数组设计的二进制存储格式,具有高效、紧凑且保留完整元数据的特点。

什么是 .npy 格式?

.npy 是 numpy 的标准二进制文件格式,专门用于存储单个 numpy 数组。这种格式具有以下重要特性:

  • 高效性:二进制存储,读写速度快
  • 完整性:保存数组的所有信息,包括形状、数据类型等
  • 跨平台:可以在不同操作系统间共享
  • 压缩支持:支持 .npz 格式进行压缩存储多个数组

让我们通过一个简单的例子来了解基本用法:

import numpy as np

# 创建一个示例数组
data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("原始数组:")
print(data)

# 保存数组到 .npy 文件
np.save('example_array.npy', data)
print("✅ 数组已保存到 example_array.npy")

# 从 .npy 文件加载数组
loaded_data = np.load('example_array.npy')
print("\n加载后的数组:")
print(loaded_data)

# 验证是否相同
print(f"\n数组是否相同: {np.array_equal(data, loaded_data)}")

基础保存与加载操作

使用 np.save() 函数

np.save() 是保存单个 numpy 数组的主要函数。它的语法简单直观:

import numpy as np

# 创建不同类型的数组
int_array = np.array([1, 2, 3, 4, 5])
float_array = np.array([1.1, 2.2, 3.3, 4.4])
complex_array = np.array([1+2j, 3+4j, 5+6j])

# 保存不同类型的数据
np.save('integer_array.npy', int_array)
np.save('float_array.npy', float_array)
np.save('complex_array.npy', complex_array)

print("✅ 不同类型的数组已保存")

# 加载并验证
loaded_int = np.load('integer_array.npy')
loaded_float = np.load('float_array.npy')
loaded_complex = np.load('complex_array.npy')

print(f"整数数组: {loaded_int}")
print(f"浮点数组: {loaded_float}")
print(f"复数数组: {loaded_complex}")

使用 np.load() 函数

np.load() 函数负责从 .npy 文件中加载数据。它返回一个包含数组数据的 numpy.ndarray 对象:

import numpy as np

# 创建一个多维数组
multi_dim_array = np.random.rand(3, 4, 5)
print(f"原数组形状: {multi_dim_array.shape}")

# 保存数组
np.save('multidim_array.npy', multi_dim_array)

# 加载数组
loaded_multi = np.load('multidim_array.npy')
print(f"加载后数组形状: {loaded_multi.shape}")

# 检查数据类型
print(f"原数组数据类型: {multi_dim_array.dtype}")
print(f"加载后数据类型: {loaded_multi.dtype}")

# 验证数值精度
print(f"数值是否完全相等: {np.allclose(multi_dim_array, loaded_multi)}")

高级保存选项

自动文件扩展名处理

numpy 在保存文件时会自动处理文件扩展名:

import numpy as np

# 即使不指定 .npy 扩展名,numpy 也会自动添加
array_data = np.linspace(0, 10, 100)

# 这些都会创建相同的文件名
np.save('test_file', array_data)        # 实际保存为 test_file.npy
np.save('test_file.npy', array_data)    # 显式指定扩展名

# 加载时也可以省略扩展名
loaded_data1 = np.load('test_file')
loaded_data2 = np.load('test_file.npy')

print(f"两种方式加载的数据是否相同: {np.array_equal(loaded_data1, loaded_data2)}")

处理特殊数据类型

numpy 支持保存各种特殊数据类型,包括结构化数组:

import numpy as np

# 创建结构化数组
dtype = [('name', 'u10'), ('age', 'i4'), ('weight', 'f4')]
structured_data = np.array([('alice', 25, 55.5), ('bob', 30, 70.2), ('charlie', 35, 80.0)], dtype=dtype)

print("原始结构化数组:")
for item in structured_data:
    print(f"姓名: {item['name']}, 年龄: {item['age']}, 体重: {item['weight']}")

# 保存结构化数组
np.save('structured_data.npy', structured_data)

# 加载结构化数组
loaded_structured = np.load('structured_data.npy')

print("\n加载后的结构化数组:")
for item in loaded_structured:
    print(f"姓名: {item['name']}, 年龄: {item['age']}, 体重: {item['weight']}")

性能优化技巧

大数组的保存策略

当处理大型数组时,内存使用和保存时间都可能成为瓶颈:

import numpy as np
import time

# 创建一个大数组
large_array = np.random.rand(10000, 10000)  # 约 800mb
print(f"数组大小: {large_array.nbytes / (1024**2):.2f} mb")

# 测量保存时间
start_time = time.time()
np.save('large_array.npy', large_array)
save_time = time.time() - start_time

print(f"保存耗时: {save_time:.2f} 秒")

# 测量加载时间
start_time = time.time()
loaded_large = np.load('large_array.npy')
load_time = time.time() - start_time

print(f"加载耗时: {load_time:.2f} 秒")
print(f"数据一致性检查: {np.array_equal(large_array, loaded_large)}")

内存映射技术

对于超大数组,可以使用内存映射来避免一次性加载所有数据:

import numpy as np

# 创建一个大数组并保存
huge_array = np.random.rand(50000, 50000)  # 约 20gb
print(f"超大数组大小: {huge_array.nbytes / (1024**3):.2f} gb")

# 保存数组
np.save('huge_array.npy', huge_array)

# 使用内存映射加载(适用于只读场景)
mapped_array = np.load('huge_array.npy', mmap_mode='r')
print(f"内存映射数组形状: {mapped_array.shape}")

# 只访问需要的部分
subset = mapped_array[1000:2000, 1000:2000]
print(f"子集形状: {subset.shape}")

# 清理内存
del huge_array, mapped_array, subset

批量处理多个数组

虽然 .npy 格式主要用于单个数组,但我们可以通过一些技巧批量处理:

import numpy as np
import os

# 创建多个数组
arrays_dict = {
    'temperature': np.random.normal(25, 5, 1000),
    'humidity': np.random.uniform(30, 80, 1000),
    'pressure': np.random.normal(1013, 20, 1000)
}

# 分别保存每个数组
for name, array in arrays_dict.items():
    filename = f"{name}.npy"
    np.save(filename, array)
    print(f"✅ 已保存 {filename}")

# 加载所有数组
loaded_arrays = {}
for name in arrays_dict.keys():
    filename = f"{name}.npy"
    loaded_arrays[name] = np.load(filename)
    print(f"📥 已加载 {filename}")

# 验证数据
for name in arrays_dict.keys():
    original = arrays_dict[name]
    loaded = loaded_arrays[name]
    print(f"{name} 数据一致性: {np.array_equal(original, loaded)}")

实际应用场景

科学实验数据管理

在科研工作中,.npy 格式非常适合存储实验数据:

import numpy as np

# 模拟实验数据
def generate_experiment_data(num_samples=1000):
    """生成模拟实验数据"""
    time_points = np.linspace(0, 10, num_samples)
    signal_1 = np.sin(time_points) + np.random.normal(0, 0.1, num_samples)
    signal_2 = np.cos(time_points) + np.random.normal(0, 0.1, num_samples)
    
    return {
        'time': time_points,
        'signal_1': signal_1,
        'signal_2': signal_2
    }

# 生成实验数据
experiment_data = generate_experiment_data()

# 保存实验数据
for key, value in experiment_data.items():
    np.save(f'experiment_{key}.npy', value)
    print(f"💾 保存实验数据: {key}")

# 后续分析时加载数据
def load_experiment_data():
    """加载实验数据"""
    data = {}
    for key in ['time', 'signal_1', 'signal_2']:
        data[key] = np.load(f'experiment_{key}.npy')
    return data

loaded_experiment = load_experiment_data()
print("📊 实验数据加载完成")
print(f"时间序列长度: {len(loaded_experiment['time'])}")

机器学习特征存储

在机器学习项目中,预处理的特征数据通常很大,.npy 格式可以有效存储:

import numpy as np

# 模拟机器学习特征数据
def create_ml_features(num_samples=50000, num_features=100):
    """创建机器学习特征矩阵"""
    # 特征数据
    features = np.random.randn(num_samples, num_features)
    
    # 标签数据
    labels = np.random.randint(0, 2, num_samples)
    
    return features, labels

# 创建特征数据
x_train, y_train = create_ml_features()
print(f"训练特征形状: {x_train.shape}")
print(f"训练标签形状: {y_train.shape}")

# 保存训练数据
np.save('ml_features_train.npy', x_train)
np.save('ml_labels_train.npy', y_train)
print("✅ 训练数据已保存")

# 加载数据用于模型训练
def load_training_data():
    """加载训练数据"""
    x = np.load('ml_features_train.npy')
    y = np.load('ml_labels_train.npy')
    return x, y

x_loaded, y_loaded = load_training_data()
print(f"加载特征形状: {x_loaded.shape}")
print(f"加载标签形状: {y_loaded.shape}")

错误处理与最佳实践

异常处理

在实际应用中,我们需要考虑各种可能的错误情况:

import numpy as np
import os

def safe_save_array(array, filename):
    """安全保存数组的函数"""
    try:
        np.save(filename, array)
        print(f"✅ 成功保存数组到 {filename}")
        return true
    except exception as e:
        print(f"❌ 保存失败: {e}")
        return false

def safe_load_array(filename):
    """安全加载数组的函数"""
    try:
        if not os.path.exists(filename):
            print(f"❌ 文件不存在: {filename}")
            return none
        
        array = np.load(filename)
        print(f"📥 成功加载数组从 {filename}")
        return array
    except exception as e:
        print(f"❌ 加载失败: {e}")
        return none

# 测试安全函数
test_array = np.random.rand(100, 100)

# 正常保存和加载
if safe_save_array(test_array, 'safe_test.npy'):
    loaded_array = safe_load_array('safe_test.npy')
    if loaded_array is not none:
        print(f"数据一致性检查: {np.array_equal(test_array, loaded_array)}")

# 测试不存在的文件
nonexistent = safe_load_array('nonexistent.npy')

文件权限和路径处理

import numpy as np
import os
from pathlib import path

def save_with_path_check(array, filepath):
    """带路径检查的保存函数"""
    # 转换为 path 对象
    path = path(filepath)
    
    # 确保父目录存在
    path.parent.mkdir(parents=true, exist_ok=true)
    
    try:
        np.save(str(path), array)
        print(f"✅ 数组已保存到: {path.absolute()}")
        return true
    except permissionerror:
        print(f"❌ 权限不足,无法保存到: {path}")
        return false
    except exception as e:
        print(f"❌ 保存过程中发生错误: {e}")
        return false

# 测试路径处理
test_data = np.random.rand(50, 50)

# 保存到相对路径
save_with_path_check(test_data, 'data/subdir/test_array.npy')

# 保存到绝对路径(如果权限允许)
home_dir = path.home()
save_with_path_check(test_data, home_dir / 'temp' / 'numpy_test.npy')

性能基准测试

让我们对比一下不同数据格式的性能表现:

import numpy as np
import time
import json
import pickle

def benchmark_formats(array_size=(10000, 1000)):
    """对比不同格式的性能"""
    
    # 创建测试数组
    test_array = np.random.rand(*array_size)
    print(f"测试数组大小: {test_array.nbytes / (1024**2):.2f} mb")
    
    results = {}
    
    # .npy 格式测试
    start_time = time.time()
    np.save('benchmark_npy.npy', test_array)
    npy_save_time = time.time() - start_time
    
    start_time = time.time()
    loaded_npy = np.load('benchmark_npy.npy')
    npy_load_time = time.time() - start_time
    
    results['npy'] = {
        'save_time': npy_save_time,
        'load_time': npy_load_time,
        'file_size': os.path.getsize('benchmark_npy.npy') / (1024**2)
    }
    
    # pickle 格式测试
    start_time = time.time()
    with open('benchmark_pickle.pkl', 'wb') as f:
        pickle.dump(test_array, f)
    pickle_save_time = time.time() - start_time
    
    start_time = time.time()
    with open('benchmark_pickle.pkl', 'rb') as f:
        loaded_pickle = pickle.load(f)
    pickle_load_time = time.time() - start_time
    
    results['pickle'] = {
        'save_time': pickle_save_time,
        'load_time': pickle_load_time,
        'file_size': os.path.getsize('benchmark_pickle.pkl') / (1024**2)
    }
    
    # json 格式测试(仅适用于小数组)
    if array_size[0] * array_size[1] < 1000000:  # 限制在1m元素以内
        start_time = time.time()
        with open('benchmark_json.json', 'w') as f:
            json.dump(test_array.tolist(), f)
        json_save_time = time.time() - start_time
        
        start_time = time.time()
        with open('benchmark_json.json', 'r') as f:
            loaded_json_list = json.load(f)
        loaded_json = np.array(loaded_json_list)
        json_load_time = time.time() - start_time
        
        results['json'] = {
            'save_time': json_save_time,
            'load_time': json_load_time,
            'file_size': os.path.getsize('benchmark_json.json') / (1024**2)
        }
    
    return results

# 运行基准测试
benchmark_results = benchmark_formats((5000, 500))

print("\n📊 性能基准测试结果:")
print("=" * 50)
for format_name, metrics in benchmark_results.items():
    print(f"\n{format_name.upper()} 格式:")
    print(f"  保存时间: {metrics['save_time']:.4f} 秒")
    print(f"  加载时间: {metrics['load_time']:.4f} 秒")
    print(f"  文件大小: {metrics['file_size']:.2f} mb")

高级功能探索

自定义对象的保存

虽然 .npy 主要用于数组,但我们可以通过一些技巧保存自定义对象:

import numpy as np

class datacontainer:
    def __init__(self, name, data, metadata=none):
        self.name = name
        self.data = np.array(data)
        self.metadata = metadata or {}
    
    def __repr__(self):
        return f"datacontainer(name='{self.name}', shape={self.data.shape})"

# 创建自定义对象
container = datacontainer(
    name="实验数据",
    data=np.random.rand(100, 50),
    metadata={
        'created_by': 'ai助手',
        'version': '1.0',
        'timestamp': '2024'
    }
)

print(f"原始容器: {container}")
print(f"元数据: {container.metadata}")

# 将对象转换为可保存的形式
saveable_dict = {
    'name': container.name,
    'data': container.data,
    'metadata': container.metadata
}

# 保存
np.save('custom_object.npy', saveable_dict)

# 加载
loaded_dict = np.load('custom_object.npy', allow_pickle=true).item()

# 重建对象
reconstructed = datacontainer(
    name=loaded_dict['name'],
    data=loaded_dict['data'],
    metadata=loaded_dict['metadata']
)

print(f"重建容器: {reconstructed}")
print(f"数据一致性: {np.array_equal(container.data, reconstructed.data)}")

条件保存和增量更新

在某些情况下,我们可能只想保存满足特定条件的数据:

import numpy as np

# 创建带有时间戳的传感器数据
timestamps = np.arange(0, 1000, 1)  # 时间戳
sensor_values = np.random.normal(0, 1, 1000)  # 传感器值

# 组合数据
sensor_data = np.column_stack((timestamps, sensor_values))
print(f"完整数据形状: {sensor_data.shape}")

# 只保存异常值(大于2倍标准差的数据)
mean_val = np.mean(sensor_values)
std_val = np.std(sensor_values)
threshold = 2 * std_val

# 找到异常值索引
anomaly_indices = np.where(np.abs(sensor_values - mean_val) > threshold)[0]
anomaly_data = sensor_data[anomaly_indices]

print(f"检测到 {len(anomaly_indices)} 个异常值")

# 保存异常值数据
np.save('anomaly_data.npy', anomaly_data)
print("✅ 异常值数据已保存")

# 加载并分析异常值
loaded_anomalies = np.load('anomaly_data.npy')
print(f"加载的异常值数量: {len(loaded_anomalies)}")

跨平台兼容性

字节序处理

在不同架构的系统间传输数据时,需要注意字节序问题:

import numpy as np

# 创建数组
original_array = np.array([1, 2, 3, 4, 5], dtype=np.int32)
print(f"原数组字节序: {original_array.dtype.byteorder}")

# 保存数组
np.save('byteorder_test.npy', original_array)

# 模拟在不同字节序系统上加载
loaded_array = np.load('byteorder_test.npy')
print(f"加载数组字节序: {loaded_array.dtype.byteorder}")

# 如果需要转换字节序
if loaded_array.dtype.byteorder == '>':
    # 大端序转小端序
    converted_array = loaded_array.byteswap().newbyteorder('<')
    print("已转换字节序")
elif loaded_array.dtype.byteorder == '<':
    # 小端序转大端序
    converted_array = loaded_array.byteswap().newbyteorder('>')
    print("已转换字节序")

# 验证数据正确性
print(f"数据一致性: {np.array_equal(original_array, loaded_array)}")

版本兼容性

确保在不同 numpy 版本间的兼容性:

import numpy as np

def check_numpy_version_compatibility():
    """检查 numpy 版本兼容性"""
    version_info = np.__version__
    print(f"当前 numpy 版本: {version_info}")
    
    # 创建测试数组
    test_arrays = [
        np.array([1, 2, 3]),  # 整数数组
        np.array([1.1, 2.2, 3.3]),  # 浮点数组
        np.array([true, false, true]),  # 布尔数组
        np.array(['hello', 'world']),  # 字符串数组
    ]
    
    for i, arr in enumerate(test_arrays):
        filename = f'version_test_{i}.npy'
        
        # 保存
        np.save(filename, arr)
        print(f"✅ 保存 {filename}: {arr.dtype}")
        
        # 加载
        loaded = np.load(filename)
        print(f"📥 加载 {filename}: {loaded.dtype}")
        
        # 验证
        is_equal = np.array_equal(arr, loaded) if arr.dtype != object else str(arr) == str(loaded)
        print(f"   一致性检查: {is_equal}\n")

check_numpy_version_compatibility()

实用工具函数

批量处理工具

开发一些实用的批量处理函数:

import numpy as np
import os
from pathlib import path

class numpyarraymanager:
    """numpy 数组管理器"""
    
    def __init__(self, base_directory='.'):
        self.base_dir = path(base_directory)
        self.base_dir.mkdir(exist_ok=true)
    
    def save_multiple(self, arrays_dict, prefix=''):
        """批量保存多个数组"""
        saved_files = []
        for name, array in arrays_dict.items():
            filename = f"{prefix}{name}.npy"
            filepath = self.base_dir / filename
            
            try:
                np.save(str(filepath), array)
                saved_files.append(str(filepath))
                print(f"✅ 保存: {filepath}")
            except exception as e:
                print(f"❌ 保存失败 {filename}: {e}")
        
        return saved_files
    
    def load_multiple(self, filenames):
        """批量加载多个数组"""
        loaded_arrays = {}
        for filename in filenames:
            filepath = self.base_dir / filename
            try:
                array_name = filepath.stem
                loaded_arrays[array_name] = np.load(str(filepath))
                print(f"📥 加载: {filepath}")
            except exception as e:
                print(f"❌ 加载失败 {filename}: {e}")
        
        return loaded_arrays
    
    def list_saved_arrays(self):
        """列出所有保存的数组文件"""
        npy_files = list(self.base_dir.glob('*.npy'))
        print(f"📁 在 {self.base_dir} 中找到 {len(npy_files)} 个 .npy 文件:")
        for file in npy_files:
            size_mb = file.stat().st_size / (1024 * 1024)
            print(f"   {file.name} ({size_mb:.2f} mb)")
        return npy_files

# 使用示例
manager = numpyarraymanager('data_arrays')

# 创建测试数据
test_data = {
    'dataset_1': np.random.rand(1000, 10),
    'dataset_2': np.random.randint(0, 100, (500, 20)),
    'labels': np.random.choice([0, 1], 1000)
}

# 批量保存
saved_files = manager.save_multiple(test_data, prefix='exp_')

# 列出保存的文件
manager.list_saved_arrays()

# 批量加载
array_names = ['exp_dataset_1.npy', 'exp_dataset_2.npy', 'exp_labels.npy']
loaded_data = manager.load_multiple(array_names)

print(f"成功加载 {len(loaded_data)} 个数组")

数据验证和完整性检查

import numpy as np
import hashlib

class arrayvalidator:
    """数组验证器"""
    
    @staticmethod
    def calculate_checksum(array):
        """计算数组的校验和"""
        # 将数组转换为字节流
        array_bytes = array.tobytes()
        # 计算 md5 哈希值
        return hashlib.md5(array_bytes).hexdigest()
    
    @staticmethod
    def save_with_checksum(array, filename):
        """保存数组并记录校验和"""
        # 保存数组
        np.save(filename, array)
        
        # 计算并保存校验和
        checksum = arrayvalidator.calculate_checksum(array)
        checksum_filename = filename.replace('.npy', '_checksum.txt')
        
        with open(checksum_filename, 'w') as f:
            f.write(checksum)
        
        print(f"✅ 数组已保存,校验和: {checksum[:16]}...")
        return checksum
    
    @staticmethod
    def validate_and_load(filename):
        """加载数组并验证完整性"""
        # 加载数组
        array = np.load(filename)
        
        # 读取保存的校验和
        checksum_filename = filename.replace('.npy', '_checksum.txt')
        try:
            with open(checksum_filename, 'r') as f:
                saved_checksum = f.read().strip()
            
            # 计算当前数组的校验和
            current_checksum = arrayvalidator.calculate_checksum(array)
            
            # 验证
            if saved_checksum == current_checksum:
                print("✅ 数据完整性验证通过")
                return array
            else:
                print("❌ 数据完整性验证失败")
                return none
                
        except filenotfounderror:
            print("⚠️ 未找到校验和文件,跳过验证")
            return array

# 测试验证功能
test_array = np.random.rand(1000, 100)
print(f"测试数组大小: {test_array.nbytes / (1024*1024):.2f} mb")

# 保存并验证
checksum = arrayvalidator.save_with_checksum(test_array, 'validated_array.npy')

# 加载并验证
validated_array = arrayvalidator.validate_and_load('validated_array.npy')

if validated_array is not none:
    print(f"验证结果: {np.array_equal(test_array, validated_array)}")

最佳实践总结

性能优化建议

import numpy as np
import time

def performance_tips_demo():
    """性能优化演示"""
    
    # 1. 预分配数组大小
    print("🔧 性能优化技巧演示")
    
    size = 1000000
    
    # 不好的做法:动态扩展
    start_time = time.time()
    bad_array = np.array([])
    for i in range(1000):  # 只演示前1000个元素
        bad_array = np.append(bad_array, i)
    bad_time = time.time() - start_time
    
    # 好的做法:预分配
    start_time = time.time()
    good_array = np.empty(size)
    for i in range(size):
        good_array[i] = i
    good_time = time.time() - start_time
    
    print(f"动态扩展耗时: {bad_time:.4f} 秒")
    print(f"预分配耗时: {good_time:.4f} 秒")
    
    # 2. 使用适当的数据类型
    print("\n📊 数据类型优化:")
    
    # 64位浮点数
    float64_array = np.random.rand(1000000)
    print(f"float64 数组大小: {float64_array.nbytes / (1024*1024):.2f} mb")
    
    # 32位浮点数(如果精度允许)
    float32_array = float64_array.astype(np.float32)
    print(f"float32 数组大小: {float32_array.nbytes / (1024*1024):.2f} mb")
    
    # 保存比较
    np.save('float64_demo.npy', float64_array)
    np.save('float32_demo.npy', float32_array)
    
    size64 = os.path.getsize('float64_demo.npy') / (1024*1024)
    size32 = os.path.getsize('float32_demo.npy') / (1024*1024)
    
    print(f"float64 文件大小: {size64:.2f} mb")
    print(f"float32 文件大小: {size32:.2f} mb")
    print(f"节省空间: {(size64 - size32) / size64 * 100:.1f}%")

performance_tips_demo()

安全性和可靠性

import numpy as np
import os
import tempfile
from contextlib import contextmanager

@contextmanager
def safe_array_operation(operation_name):
    """安全数组操作上下文管理器"""
    print(f"🚀 开始 {operation_name}")
    try:
        yield
        print(f"✅ {operation_name} 完成")
    except exception as e:
        print(f"❌ {operation_name} 失败: {e}")
        raise

def robust_array_handling():
    """健壮的数组处理示例"""
    
    # 使用临时目录进行测试
    with tempfile.temporarydirectory() as temp_dir:
        print(f"📁 使用临时目录: {temp_dir}")
        
        # 创建测试数据
        test_arrays = {
            'small': np.random.rand(100, 10),
            'medium': np.random.rand(10000, 100),
            'large': np.random.rand(100000, 100)
        }
        
        for name, array in test_arrays.items():
            filename = os.path.join(temp_dir, f'{name}_array.npy')
            
            with safe_array_operation(f"保存 {name} 数组"):
                np.save(filename, array)
                print(f"   大小: {os.path.getsize(filename) / 1024:.2f} kb")
            
            with safe_array_operation(f"加载 {name} 数组"):
                loaded_array = np.load(filename)
                assert np.array_equal(array, loaded_array), "数组不匹配"
                print(f"   形状: {loaded_array.shape}")

robust_array_handling()

总结

.npy 格式作为 numpy 的原生二进制存储格式,在科学计算和数据分析领域发挥着重要作用。通过本文的详细介绍和丰富的代码示例,我们可以看到:

  1. 基础操作简单易用np.save()np.load() 提供了直观的接口
  2. 性能优势明显:相比文本格式,二进制存储更高效
  3. 功能丰富多样:支持各种数据类型和高级特性
  4. 可靠性强:保持完整的元数据信息,确保数据完整性

在实际应用中,我们应该根据具体需求选择合适的保存策略,并遵循最佳实践来优化性能和确保数据安全。

以上就是python numpy实现将数组保存为.npy格式的详细内容,更多关于python numpy数组保存的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com