欢迎光临
我们一直在努力

Python NumPy - 第一个 NumPy 程序 创建并打印数组

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

在这里插入图片描述

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕NumPy这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!


文章目录

  • Python NumPy – 第一个 NumPy 程序:创建并打印数组 🐍🔢
    • 引言 🚀
    • 什么是NumPy?🤔
      • NumPy的主要特点 ✨
    • 安装NumPy 💻
    • 导入NumPy库 📚
    • 创建NumPy数组的基本方法 🔧
      • 1. 从Python列表创建数组
      • 2. 使用NumPy内置函数创建数组
        • 创建全零数组
        • 创建全一数组
        • 创建指定值填充的数组
      • 3. 创建序列数组
        • 使用arange函数
        • 使用linspace函数
      • 4. 创建特殊数组
        • 单位矩阵
        • 对角矩阵
    • 数组属性详解 📊
    • 打印数组的不同方式 🖨️
      • 1. 基本打印
      • 2. 自定义打印选项
      • 3. 格式化打印
    • 实际应用示例 🌟
      • 示例1:学生成绩分析
      • 示例2:图像像素处理
      • 示例3:时间序列数据
    • 错误处理和调试技巧 🛠️
    • 性能比较 ⚡
    • 最佳实践和建议 💡
      • 1. 数组创建最佳实践
      • 2. 打印和显示最佳实践
      • 3. 代码组织和文档
    • 高级主题探索 🔍
      • 数组的内存布局
      • 数组的视图与复制
    • 实用工具函数 🛠️
    • mermaid 图表示例 📈
    • 与其他库的集成 🤝
    • 学习资源推荐 📚
    • 常见问题解答 ❓
      • Q1: NumPy数组和Python列表有什么区别?
      • Q2: 如何选择合适的数据类型?
      • Q3: 什么时候应该使用视图而不是副本?
    • 总结 🎯

Python NumPy – 第一个 NumPy 程序:创建并打印数组 🐍🔢

引言 🚀

在数据科学和数值计算的世界中,NumPy(Numerical Python)是一个不可或缺的强大工具。它为Python提供了高性能的多维数组对象和处理这些数组的工具。对于任何想要深入学习机器学习、数据分析或科学计算的人来说,掌握NumPy是至关重要的第一步。

今天,我们将从最基础的内容开始——创建和打印NumPy数组。虽然这看起来很简单,但它是理解更复杂概念的基础。让我们一起踏上这段令人兴奋的NumPy之旅吧!🌟

什么是NumPy?🤔

NumPy是Python的一个开源库,专门用于处理大型多维数组和矩阵。它提供了大量的数学函数来操作这些数组,使得数值计算变得简单而高效。NumPy的核心是它的ndarray对象,这是一个强大的N维数组类型。

NumPy的主要特点 ✨

  • 高效的数组操作:NumPy数组比Python原生列表快得多
  • 广播功能:允许不同形状的数组进行算术运算
  • 丰富的数学函数:提供线性代数、傅里叶变换等功能
  • 内存效率:连续的内存存储提高了缓存局部性
  • 集成性强:与其他科学计算库完美配合

安装NumPy 💻

在开始编写第一个NumPy程序之前,我们需要确保已经安装了NumPy库。如果你还没有安装,可以通过以下命令进行安装:

pip install numpy

或者如果你使用conda环境管理器:

conda install numpy

安装完成后,我们就可以开始我们的第一个NumPy程序了!

导入NumPy库 📚

在Python脚本中使用NumPy的第一步是导入它。通常我们会使用np作为别名,这是NumPy社区的标准约定:

import numpy as np

这个简单的导入语句为我们打开了通往强大数值计算世界的大门。现在我们可以开始创建我们的第一个数组了!

创建NumPy数组的基本方法 🔧

1. 从Python列表创建数组

最直接的方法是从现有的Python列表创建NumPy数组:

import numpy as np

# 从一维列表创建数组
list_1d = [1, 2, 3, 4, 5]
array_1d = np.array(list_1d)
print("一维数组:")
print(array_1d)
print(f"数组形状: {array_1d.shape}")
print(f"数组维度: {array_1d.ndim}")
print(f"数组元素类型: {array_1d.dtype}")

print("\\n" + "="*50 + "\\n")

# 从二维列表创建数组
list_2d = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
array_2d = np.array(list_2d)
print("二维数组:")
print(array_2d)
print(f"数组形状: {array_2d.shape}")
print(f"数组维度: {array_2d.ndim}")
print(f"数组元素类型: {array_2d.dtype}")

运行结果:

一维数组:
[1 2 3 4 5]
数组形状: (5,)
数组维度: 1
数组元素类型: int64

==================================================

二维数组:
[[1 2 3]
[4 5 6]
[7 8 9]]
数组形状: (3, 3)
数组维度: 2
数组元素类型: int64

2. 使用NumPy内置函数创建数组

NumPy提供了许多便捷的函数来创建特定类型的数组:

创建全零数组

import numpy as np

# 创建一维全零数组
zeros_1d = np.zeros(5)
print("一维全零数组:")
print(zeros_1d)

print("\\n" + "-"*30 + "\\n")

# 创建二维全零数组
zeros_2d = np.zeros((3, 4))
print("二维全零数组:")
print(zeros_2d)

print("\\n" + "-"*30 + "\\n")

# 指定数据类型
zeros_float = np.zeros(5, dtype=float)
print("浮点型全零数组:")
print(zeros_float)

运行结果:

一维全零数组:
[0. 0. 0. 0. 0.]

——————————

二维全零数组:
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]

——————————

浮点型全零数组:
[0. 0. 0. 0. 0.]

创建全一数组

import numpy as np

# 创建全一数组
ones_array = np.ones((2, 3))
print("全一数组:")
print(ones_array)

print("\\n" + "-"*30 + "\\n")

# 指定数据类型
ones_int = np.ones(4, dtype=int)
print("整型全一数组:")
print(ones_int)

运行结果:

全一数组:
[[1. 1. 1.]
[1. 1. 1.]]

——————————

整型全一数组:
[1 1 1 1]

创建指定值填充的数组

import numpy as np

# 创建用指定值填充的数组
filled_array = np.full((2, 3), 7)
print("用7填充的数组:")
print(filled_array)

print("\\n" + "-"*30 + "\\n")

# 使用浮点数
filled_float = np.full(5, 3.14)
print("用3.14填充的数组:")
print(filled_float)

运行结果:

用7填充的数组:
[[7 7 7]
[7 7 7]]

——————————

用3.14填充的数组:
[3.14 3.14 3.14 3.14 3.14]

3. 创建序列数组

NumPy提供了多种创建数字序列的方法:

使用arange函数

import numpy as np

# 创建从0到9的数组
range_array = np.arange(10)
print("从0到9的数组:")
print(range_array)

print("\\n" + "-"*30 + "\\n")

# 创建从2到10,步长为2的数组
step_array = np.arange(2, 11, 2)
print("步长为2的数组:")
print(step_array)

print("\\n" + "-"*30 + "\\n")

# 创建浮点数序列
float_range = np.arange(0, 1, 0.1)
print("浮点数序列:")
print(float_range)

运行结果:

从0到9的数组:
[0 1 2 3 4 5 6 7 8 9]

——————————

步长为2的数组:
[2 4 6 8 10]

——————————

浮点数序列:
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

使用linspace函数

import numpy as np

# 在指定区间内创建等间距的数组
linear_space = np.linspace(0, 1, 5)
print("等间距数组:")
print(linear_space)

print("\\n" + "-"*30 + "\\n")

# 不包含终点
linear_no_end = np.linspace(0, 10, 5, endpoint=False)
print("不包含终点的等间距数组:")
print(linear_no_end)

运行结果:

等间距数组:
[0. 0.25 0.5 0.75 1. ]

——————————

不包含终点的等间距数组:
[0. 2. 4. 6. 8.]

4. 创建特殊数组

NumPy还提供了一些特殊的数组创建方法:

单位矩阵

import numpy as np

# 创建单位矩阵
identity_matrix = np.eye(3)
print("3×3单位矩阵:")
print(identity_matrix)

print("\\n" + "-"*30 + "\\n")

# 非方阵的单位矩阵
rect_identity = np.eye(3, 4)
print("3×4单位矩阵:")
print(rect_identity)

运行结果:

3×3单位矩阵:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

——————————

3×4单位矩阵:
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]]

对角矩阵

import numpy as np

# 创建对角矩阵
diagonal_elements = [1, 2, 3, 4]
diagonal_matrix = np.diag(diagonal_elements)
print("对角矩阵:")
print(diagonal_matrix)

print("\\n" + "-"*30 + "\\n")

# 从现有数组提取对角线
existing_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
diagonal_from_array = np.diag(existing_array)
print("从现有数组提取对角线:")
print(diagonal_from_array)

运行结果:

对角矩阵:
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]

——————————

从现有数组提取对角线:
[1 5 9]

数组属性详解 📊

了解数组的各种属性对于有效地使用NumPy非常重要:

import numpy as np

# 创建一个复杂的多维数组
complex_array = np.array([[[1, 2, 3], [4, 5, 6]],
[[7, 8, 9], [10, 11, 12]]])

print("复杂三维数组:")
print(complex_array)
print()

# 基本属性
print(f"数组形状 (shape): {complex_array.shape}")
print(f"数组维度 (ndim): {complex_array.ndim}")
print(f"数组大小 (size): {complex_array.size}")
print(f"元素数据类型 (dtype): {complex_array.dtype}")
print(f"每个元素的字节大小 (itemsize): {complex_array.itemsize}")
print(f"总字节数 (nbytes): {complex_array.nbytes}")
print(f"数组的内存布局顺序 (flags):")
for flag in ['C_CONTIGUOUS', 'F_CONTIGUOUS', 'OWNDATA']:
print(f" {flag}: {getattr(complex_array.flags, flag)}")

运行结果:

复杂三维数组:
[[[ 1 2 3]
[ 4 5 6]]

[[ 7 8 9]
[10 11 12]]]

数组形状 (shape): (2, 2, 3)
数组维度 (ndim): 3
数组大小 (size): 12
元素数据类型 (dtype): int64
每个元素的字节大小 (itemsize): 8
总字节数 (nbytes): 96
数组的内存布局顺序 (flags):
C_CONTIGUOUS: True
F_CONTIGUOUS: False
OWNDATA: True

打印数组的不同方式 🖨️

NumPy提供了多种方式来打印和显示数组,每种方式都有其特定的用途:

1. 基本打印

import numpy as np

# 创建不同大小的数组
small_array = np.arange(10)
large_array = np.random.rand(100).reshape(10, 10)

print("小数组的默认打印:")
print(small_array)
print()

print("大数组的默认打印:")
print(large_array)
print()

2. 自定义打印选项

import numpy as np

# 创建测试数组
test_array = np.random.rand(6, 6) * 100

print("默认打印设置:")
print(test_array)
print()

# 修改打印精度
np.set_printoptions(precision=2)
print("修改精度后的打印:")
print(test_array)
print()

# 修改阈值以显示完整数组
original_threshold = np.get_printoptions()['threshold']
np.set_printoptions(threshold=np.inf)
print("显示完整数组:")
print(test_array)
print()

# 恢复原始设置
np.set_printoptions(threshold=original_threshold, precision=8)

3. 格式化打印

import numpy as np

# 创建示例数组
data_array = np.array([[1.23456789, 2.34567890],
[3.45678901, 4.56789012]])

print("标准打印:")
print(data_array)
print()

# 使用字符串格式化
print("使用字符串格式化的打印:")
formatted_strings = []
for row in data_array:
formatted_row = [f"{val:.3f}" for val in row]
formatted_strings.append(formatted_row)

for row in formatted_strings:
print(row)
print()

# 使用numpy的格式化函数
print("使用numpy格式化函数:")
np.set_printoptions(formatter={'float': '{:.3f}'.format})
print(data_array)
np.set_printoptions() # 恢复默认设置

实际应用示例 🌟

让我们通过一些实际的例子来展示如何创建和打印NumPy数组:

示例1:学生成绩分析

import numpy as np

# 模拟学生的考试成绩
students = ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve']
subjects = ['Math', 'Science', 'English', 'History']

# 创建随机成绩数组 (5个学生, 4门科目)
np.random.seed(42) # 设置随机种子以便结果可重现
scores = np.random.randint(60, 101, size=(5, 4))

print("学生成绩表:")
print("="*50)
print(f"{'Name':<10}", end="")
for subject in subjects:
print(f"{subject:<10}", end="")
print()
print("-"*50)

for i, student in enumerate(students):
print(f"{student:<10}", end="")
for score in scores[i]:
print(f"{score:<10}", end="")
print()

print("\\n统计信息:")
print("-"*30)
print(f"平均分: {np.mean(scores):.2f}")
print(f"最高分: {np.max(scores)}")
print(f"最低分: {np.min(scores)}")
print(f"各科平均分: {np.mean(scores, axis=0)}")
print(f"各人平均分: {np.mean(scores, axis=1)}")

示例2:图像像素处理

import numpy as np

# 模拟一个简单的8×8黑白图像
def create_checkerboard():
"""创建一个棋盘图案"""
board = np.zeros((8, 8), dtype=int)
board[1::2, ::2] = 1 # 奇数行偶数列
board[::2, 1::2] = 1 # 偶数行奇数列
return board

checkerboard = create_checkerboard()

print("8×8棋盘图案:")
print("="*20)
for row in checkerboard:
print(' '.join(['██' if cell == 1 else ' ' for cell in row]))

print("\\n数组表示:")
print(checkerboard)

# 计算黑色和白色像素的数量
black_pixels = np.sum(checkerboard == 1)
white_pixels = np.sum(checkerboard == 0)
print(f"\\n黑色像素数量: {black_pixels}")
print(f"白色像素数量: {white_pixels}")

示例3:时间序列数据

import numpy as np

# 创建模拟的时间序列数据
days = 30
dates = np.arange(1, days + 1)
base_value = 100
trend = 0.5 * dates # 上升趋势
noise = np.random.normal(0, 5, days) # 随机噪声
values = base_value + trend + noise

print("时间序列数据:")
print("="*40)
print(f"{'日期':<6} {'数值':<10}")
print("-"*40)
for date, value in zip(dates[:10], values[:10]): # 只显示前10天
print(f"{date:<6} {value:<10.2f}")

print("…")
print(f"{'…':<6} {'…':<10}")
for date, value in zip(dates[–5:], values[–5:]): # 显示最后5天
print(f"{date:<6} {value:<10.2f}")

print(f"\\n统计摘要:")
print(f"最小值: {np.min(values):.2f}")
print(f"最大值: {np.max(values):.2f}")
print(f"平均值: {np.mean(values):.2f}")
print(f"标准差: {np.std(values):.2f}")

错误处理和调试技巧 🛠️

在使用NumPy时,可能会遇到各种错误。了解如何识别和解决这些问题是很重要的:

import numpy as np

# 常见错误示例和解决方案

# 1. 维度不匹配错误
try:
arr1 = np.array([1, 2, 3])
arr2 = np.array([[1, 2], [3, 4]])
result = arr1 + arr2 # 这会引发广播错误吗?
print("加法结果:", result)
except ValueError as e:
print(f"维度错误: {e}")

# 2. 数据类型问题
try:
# 尝试将字符串转换为数字数组
string_list = ['1', '2', '3', 'not_a_number']
numeric_array = np.array(string_list, dtype=float)
print("数值数组:", numeric_array)
except ValueError as e:
print(f"类型转换错误: {e}")
# 解决方案:使用更安全的转换方法
print("使用更安全的转换:")
safe_array = np.array([float(x) if x.replace('.', '').isdigit() else 0
for x in string_list])
print("安全转换后:", safe_array)

# 3. 内存不足错误
try:
# 尝试创建非常大的数组
huge_array = np.ones((1000000, 1000000)) # 这可能超出内存限制
print("大数组创建成功")
except MemoryError as e:
print(f"内存错误: {e}")
print("建议: 使用较小的数组或分块处理数据")

# 调试技巧
def debug_array(arr, name="Array"):
"""打印数组的详细调试信息"""
print(f"\\n{name} 调试信息:")
print(f" 类型: {type(arr)}")
print(f" 形状: {arr.shape}")
print(f" 维度: {arr.ndim}")
print(f" 大小: {arr.size}")
print(f" 数据类型: {arr.dtype}")
print(f" 是否连续: {arr.flags['C_CONTIGUOUS']}")
if arr.size <= 20: # 只有当数组不太大时才打印内容
print(f" 内容:\\n{arr}")
else:
print(f" 前5个元素: {arr.flat[:5]}")
print(f" 后5个元素: {arr.flat[–5:]}")

# 测试调试函数
test_arrays = [
np.array([1, 2, 3, 4, 5]),
np.array([[1, 2], [3, 4]]),
np.zeros((100, 100))
]

for i, arr in enumerate(test_arrays):
debug_array(arr, f"Test Array {i+1}")

性能比较 ⚡

让我们比较一下NumPy数组和Python原生列表在性能上的差异:

import numpy as np
import time

# 创建大型数据集进行性能测试
size = 1000000
python_list = list(range(size))
numpy_array = np.arange(size)

# 测试加法操作性能
def test_python_addition(lst):
return [x + 1 for x in lst]

def test_numpy_addition(arr):
return arr + 1

# Python列表加法
start_time = time.time()
result_list = test_python_addition(python_list)
python_time = time.time() – start_time

# NumPy数组加法
start_time = time.time()
result_array = test_numpy_addition(numpy_array)
numpy_time = time.time() – start_time

print("性能比较结果:")
print(f"Python列表加法耗时: {python_time:.4f} 秒")
print(f"NumPy数组加法耗时: {numpy_time:.4f} 秒")
print(f"NumPy比Python快 {python_time/numpy_time:.1f} 倍")

# 内存使用比较
import sys
print(f"\\n内存使用比较:")
print(f"Python列表内存占用: {sys.getsizeof(python_list)} 字节")
print(f"NumPy数组内存占用: {numpy_array.nbytes} 字节")
print(f"内存效率提升: {sys.getsizeof(python_list)/numpy_array.nbytes:.1f} 倍")

最佳实践和建议 💡

基于我们的学习和实践经验,以下是一些使用NumPy创建和打印数组的最佳实践:

1. 数组创建最佳实践

import numpy as np

# 推荐的做法
# 1. 明确指定数据类型
explicit_dtype = np.array([1, 2, 3], dtype=np.int32)
print("明确指定数据类型:", explicit_dtype.dtype)

# 2. 使用合适的初始化函数
# 对于已知大小的数组,预分配内存
pre_allocated = np.empty(1000) # 快速创建未初始化数组
zeros_array = np.zeros(1000) # 创建全零数组
ones_array = np.ones(1000) # 创建全一数组

# 3. 避免不必要的数组复制
original_array = np.arange(100)
view_array = original_array[::2] # 视图,不复制数据
copy_array = original_array[::2].copy() # 显式复制

print(f"视图共享数据: {np.shares_memory(original_array, view_array)}")
print(f"副本独立数据: {np.shares_memory(original_array, copy_array)}")

2. 打印和显示最佳实践

import numpy as np

# 设置全局打印选项
np.set_printoptions(
precision=3, # 浮点数精度
suppress=True, # 抑制科学记数法
linewidth=120, # 行宽
threshold=1000 # 超过此大小则省略显示
)

# 创建测试数据
test_data = np.random.rand(5, 8) * 1000

print("优化后的打印输出:")
print(test_data)

# 对于调试,临时修改打印选项
with np.printoptions(precision=6, suppress=False):
print("\\n临时高精度显示:")
print(test_data[0, :3]) # 只显示部分数据

# 恢复默认设置
np.set_printoptions() # 恢复默认值

3. 代码组织和文档

import numpy as np

def create_sample_dataset(rows, cols, seed=None):
"""
创建示例数据集

参数:
rows (int): 行数
cols (int): 列数
seed (int, optional): 随机种子

返回:
numpy.ndarray: 生成的数据数组

示例:
>>> data = create_sample_dataset(3, 4, seed=42)
>>> print(data.shape)
(3, 4)
"""
if seed is not None:
np.random.seed(seed)

return np.random.randn(rows, cols)

# 使用示例
sample_data = create_sample_dataset(5, 3, seed=123)
print("示例数据集:")
print(sample_data)

高级主题探索 🔍

数组的内存布局

import numpy as np

# 创建不同内存布局的数组
c_order = np.array([[1, 2, 3], [4, 5, 6]], order='C') # C风格(行优先)
f_order = np.array([[1, 2, 3], [4, 5, 6]], order='F') # Fortran风格(列优先)

print("C风格数组:")
print(f" 连续性: {c_order.flags['C_CONTIGUOUS']}")
print(f" Fortran连续性: {c_order.flags['F_CONTIGUOUS']}")

print("\\nFortran风格数组:")
print(f" 连续性: {f_order.flags['C_CONTIGUOUS']}")
print(f" Fortran连续性: {f_order.flags['F_CONTIGUOUS']}")

# 转置操作对内存布局的影响
transposed_c = c_order.T
print(f"\\n转置后的C风格数组:")
print(f" 连续性: {transposed_c.flags['C_CONTIGUOUS']}")
print(f" Fortran连续性: {transposed_c.flags['F_CONTIGUOUS']}")

数组的视图与复制

import numpy as np

# 理解视图和复制的区别
original = np.arange(12).reshape(3, 4)
print("原始数组:")
print(original)

# 创建视图
view_slice = original[1:, 1:] # 这是视图
print(f"\\n切片视图 (共享数据):")
print(view_slice)

# 修改视图会影响原始数组
view_slice[0, 0] = 999
print(f"\\n修改视图后原始数组:")
print(original)

# 恢复原始值
original[1, 1] = 5

# 创建副本
copy_slice = original[1:, 1:].copy() # 这是副本
print(f"\\n副本 (独立数据):")
print(copy_slice)

# 修改副本不会影响原始数组
copy_slice[0, 0] = 888
print(f"\\n修改副本后原始数组:")
print(original)

实用工具函数 🛠️

NumPy提供了许多实用的工具函数来帮助我们更好地理解和操作数组:

import numpy as np

# 创建示例数组
example_array = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

print("示例数组:")
print(example_array)

# 数组信息工具
print(f"\\n数组基本信息:")
print(f" 扁平化数组: {example_array.flatten()}")
print(f" 转置数组:\\n{example_array.T}")
print(f" 数组重塑 (1×9): {example_array.reshape(1, 9)}")
print(f" 数组重塑 (9×1):\\n{example_array.reshape(9, 1)}")

# 条件选择
condition_result = np.where(example_array > 5, example_array, 0)
print(f"\\n条件选择 (大于5的元素保留,其余为0):")
print(condition_result)

# 数组连接
array1 = np.array([[1, 2], [3, 4]])
array2 = np.array([[5, 6], [7, 8]])

print(f"\\n水平连接:")
h_concat = np.hstack([array1, array2])
print(h_concat)

print(f"\\n垂直连接:")
v_concat = np.vstack([array1, array2])
print(v_concat)

# 数组分割
split_arrays = np.hsplit(example_array, 3)
print(f"\\n水平分割结果:")
for i, arr in enumerate(split_arrays):
print(f" 部分 {i+1}: {arr.flatten()}")

mermaid 图表示例 📈

#mermaid-svg-gntT8FdQveSQNSZ6{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gntT8FdQveSQNSZ6 .error-icon{fill:#552222;}#mermaid-svg-gntT8FdQveSQNSZ6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gntT8FdQveSQNSZ6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gntT8FdQveSQNSZ6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gntT8FdQveSQNSZ6 .marker.cross{stroke:#333333;}#mermaid-svg-gntT8FdQveSQNSZ6 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gntT8FdQveSQNSZ6 p{margin:0;}#mermaid-svg-gntT8FdQveSQNSZ6 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-gntT8FdQveSQNSZ6 .cluster-label text{fill:#333;}#mermaid-svg-gntT8FdQveSQNSZ6 .cluster-label span{color:#333;}#mermaid-svg-gntT8FdQveSQNSZ6 .cluster-label span p{background-color:transparent;}#mermaid-svg-gntT8FdQveSQNSZ6 .label text,#mermaid-svg-gntT8FdQveSQNSZ6 span{fill:#333;color:#333;}#mermaid-svg-gntT8FdQveSQNSZ6 .node rect,#mermaid-svg-gntT8FdQveSQNSZ6 .node circle,#mermaid-svg-gntT8FdQveSQNSZ6 .node ellipse,#mermaid-svg-gntT8FdQveSQNSZ6 .node polygon,#mermaid-svg-gntT8FdQveSQNSZ6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gntT8FdQveSQNSZ6 .rough-node .label text,#mermaid-svg-gntT8FdQveSQNSZ6 .node .label text,#mermaid-svg-gntT8FdQveSQNSZ6 .image-shape .label,#mermaid-svg-gntT8FdQveSQNSZ6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-gntT8FdQveSQNSZ6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gntT8FdQveSQNSZ6 .rough-node .label,#mermaid-svg-gntT8FdQveSQNSZ6 .node .label,#mermaid-svg-gntT8FdQveSQNSZ6 .image-shape .label,#mermaid-svg-gntT8FdQveSQNSZ6 .icon-shape .label{text-align:center;}#mermaid-svg-gntT8FdQveSQNSZ6 .node.clickable{cursor:pointer;}#mermaid-svg-gntT8FdQveSQNSZ6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gntT8FdQveSQNSZ6 .arrowheadPath{fill:#333333;}#mermaid-svg-gntT8FdQveSQNSZ6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gntT8FdQveSQNSZ6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gntT8FdQveSQNSZ6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gntT8FdQveSQNSZ6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gntT8FdQveSQNSZ6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gntT8FdQveSQNSZ6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gntT8FdQveSQNSZ6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gntT8FdQveSQNSZ6 .cluster text{fill:#333;}#mermaid-svg-gntT8FdQveSQNSZ6 .cluster span{color:#333;}#mermaid-svg-gntT8FdQveSQNSZ6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gntT8FdQveSQNSZ6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gntT8FdQveSQNSZ6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-gntT8FdQveSQNSZ6 .icon-shape,#mermaid-svg-gntT8FdQveSQNSZ6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gntT8FdQveSQNSZ6 .icon-shape p,#mermaid-svg-gntT8FdQveSQNSZ6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gntT8FdQveSQNSZ6 .icon-shape .label rect,#mermaid-svg-gntT8FdQveSQNSZ6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gntT8FdQveSQNSZ6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gntT8FdQveSQNSZ6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gntT8FdQveSQNSZ6 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

成功

失败

是

否

开始

导入NumPy

创建数组

安装NumPy

选择创建方法

从列表创建

使用内置函数

创建特殊数组

打印数组

需要更多操作?

执行其他NumPy操作

结束

与其他库的集成 🤝

NumPy作为Python科学计算生态系统的核心,与其他库有着良好的集成:

import numpy as np

# 与matplotlib的集成示例
try:
import matplotlib.pyplot as plt

# 创建数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

# 如果需要可视化,可以这样使用
print("数据已准备就绪,可用于matplotlib绘图")
print(f"x轴数据点数: {len(x)}")
print(f"y轴数据范围: [{np.min(y):.2f}, {np.max(y):.2f}]")

except ImportError:
print("matplotlib未安装,跳过可视化示例")

# 与pandas的集成
try:
import pandas as pd

# 创建NumPy数组
data = np.random.rand(5, 3)

# 转换为pandas DataFrame
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
print("\\nPandas DataFrame (来自NumPy数组):")
print(df.head())

except ImportError:
print("pandas未安装,跳过DataFrame示例")

学习资源推荐 📚

为了进一步学习NumPy,以下是一些优质的学习资源:

  • NumPy官方文档 – 最权威的参考资料
  • SciPy Lecture Notes – 包含NumPy在内的科学计算教程
  • Real Python NumPy教程 – 适合初学者的详细指南
  • 这些资源提供了从基础到高级的全面覆盖,可以帮助你深入理解NumPy的各种功能。

    常见问题解答 ❓

    Q1: NumPy数组和Python列表有什么区别?

    NumPy数组相比Python列表具有以下优势:

    • 更高的内存效率
    • 更快的数值计算速度
    • 支持向量化操作
    • 提供丰富的数学函数

    Q2: 如何选择合适的数据类型?

    选择数据类型时应考虑:

    • 精度要求:int32 vs int64,float32 vs float64
    • 内存限制:较小的数据类型节省内存
    • 兼容性:某些操作可能需要特定的数据类型

    Q3: 什么时候应该使用视图而不是副本?

    • 当你需要修改原始数据时使用视图
    • 当你需要独立的数据副本时使用.copy()
    • 视图节省内存,副本提供数据安全性

    总结 🎯

    通过这篇文章,我们深入了解了NumPy的第一个程序——创建和打印数组。我们学习了:

  • 基本概念:了解了NumPy是什么以及为什么重要
  • 安装和导入:学会了如何设置NumPy环境
  • 数组创建:掌握了多种创建数组的方法
  • 数组属性:理解了数组的重要属性和特征
  • 打印技术:学会了不同的数组显示方式
  • 实际应用:通过实例看到了NumPy在现实场景中的应用
  • 最佳实践:获得了编写高质量NumPy代码的指导原则
  • NumPy是数据科学和数值计算的基础工具,掌握它将为你打开通往更高级数据分析和机器学习的大门。从创建第一个简单的数组开始,你会逐渐发现NumPy的强大之处,并能够在各种项目中充分利用它的能力。

    记住,编程学习是一个循序渐进的过程。今天的第一个NumPy程序只是开始,随着不断练习和探索,你会越来越熟练地使用这个强大的工具。继续前进,在NumPy的世界中发现更多的可能性吧!🚀✨


    🙌 感谢你读到这里! 🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。 💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友! 💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿 🔔 关注我,不错过下一篇干货!我们下期再见!✨

    赞(0)
    未经允许不得转载:171主机测评 » Python NumPy - 第一个 NumPy 程序 创建并打印数组
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址