numpy 第四课--拼接

本文详细介绍了使用NumPy进行数组操作的方法,包括数组的创建、拼接、元素筛选及数学运算等核心功能。通过实例展示了如何进行竖直拼接、水平拼接,以及如何构建全0和全1数组,并进行了数组的拼接操作。此外,还深入探讨了如何获取数组中的最大值及其位置,判断特殊值如NaN和Inf,以及如何统计非0、NaN和Inf的数量。最后,讲解了如何处理包含NaN和Inf的数组求和问题。
# -*- coding:utf-8 -*-
import numpy as np

t1 = np.arange(6).reshape(2, 3)
t2 = np.arange(10, 16).reshape(2, 3)
# 竖直拼接,vertically 相当于union all
# print(np.vstack((t1, t2)))
# 水平拼接 horizontally
# print(np.hstack((t1, t2)))
print("*" * 10)
# 构建全为0的数组
z = np.zeros((t1.shape[0], 1), dtype="int")
t1 = np.hstack((z, t1))
# 构建全为1的数组
o = np.ones((t2.shape[0], 1)).astype(np.int)
t2 = np.hstack((o, t2))

print(np.vstack((t1, t2)))

print("*" * 50)
t1[0, 0] = 7
t1[0, 2] = 6
print(t1)
# 第一列最大值是7,返回位置0
# 第二列最大值是3,返回位置1....其余同理
print(np.argmax(t1, axis=0))  # [0 1 0 1]
print(np.argmax(t1))  # 返回一维数组中最大值的位置

print("*" * 50)
# 常用判断
print(np.nan == np.nan)  # False
print(np.inf == np.inf)  # True
t1 = t1.astype("float")
t1[1, 1] = np.nan
t1[1, 2] = np.inf
print(t1)
# 获取非0个数,包括nan,inf
print(np.count_nonzero(t1))

# 获取nan个数 方法1
print(np.count_nonzero(t1 != t1))
# 获取nan个数 方法2
print(np.count_nonzero(np.isnan(t1)))

# 求和 有nan的话返回nan,有inf的话返回inf
print(np.sum(t1))
t1[1, 1] = 3
print(t1)
print(np.sum(t1))  # info
print(np.sum(t1, axis=0))  # [ 7.  3. inf  7.]
print(np.max(t1, axis=0))
# 极值=最大值-最小值
print(np.ptp(t1, axis=0))

t1 = np.arange(10).reshape((2, 5)).astype(np.float)
print(t1)
t2 = t1[:, 1]
# 注意:此处修改的t2,会影响t1
t2[1] = -1
print(t1)

 

<think>嗯,用户的问题是关于如何在Python中使用NumPy对三维数组按第一维度进行拼接,使用concatenate或vstack方法。我需要先理解用户的具体需求,然后结合自己的知识和参考资料来组织答案。 首先,用户提到了三维数组和第一维度的拼接。在NumPy中,三维数组的形状通常是(depth, rows, columns),也就是(层,行,列)。第一维度也就是深度方向,也就是axis=0。用户想沿着这个轴将多个三维数组拼接起来,类似于堆叠更多的层。 接下来,我需要回忆concatenate和vstack的用法。concatenate函数需要指定axis参数,对于三维数组来说,axis=0就是沿着第一个维度拼接。而vstack函数相当于concatenate在axis=0的情况,所以可能两者都可以用,但需要确认它们的参数要求。 然后查看用户提供的引用,引用[2]和[3]提到了vstack和concatenate的使用示例。比如引用[2]中,vstack用于堆叠二维数组,而引用[3]中的concatenate连接一维数组。但用户的问题是关于三维数组的,所以可能需要调整示例。 我需要确保回答中正确使用axis参数。对于三维数组,假设有两个形状为(2,3,4)的数组,沿axis=0拼接后形状应为(4,3,4)。需要给出具体的例子,包括导入numpy,创建数组,使用concatenate和vstack,并说明结果形状的变化。 另外,用户可能需要知道两种方法的区别。比如vstack是否在内部调用了concatenate,或者是否有其他限制。比如vstack要求除第一个轴外的其他维度必须相同,而concatenate则需要明确指定axis。 还要注意代码示例的正确性。例如,使用np.concatenate((arr1, arr2), axis=0)和np.vstack((arr1, arr2))是否等效,需要验证。 可能还需要提到其他方法,比如np.stack,但用户只问了concatenate和vstack,所以可能需要集中在这些方法上。 同时,要确保回答结构清晰,步骤明确,帮助用户逐步解决问题。可能还需要指出常见错误,比如维度不匹配的情况,或者axis参数错误的情况,但用户的问题主要是正确的方法,所以可能不需要深入错误处理,除非相关。 最后,生成相关问题,帮助用户扩展知识,比如其他轴的拼接,或者hstack、dstack的使用,或者处理不同形状数组的方法,比如reshape或调整维度后再拼接。 总结步骤: 1. 解释三维数组的结构和轴的含义。 2. 说明concatenate的使用方法,指定axis=0。 3. 提供concatenate的代码示例,展示输入和输出形状。 4. 说明vstack的等效使用,可能内部调用concatenate,适用于垂直堆叠。 5. 提供vstack的代码示例,对比结果。 6. 比较两种方法的适用情况,指出vstack可能需要数组在其他维度上匹配。 7. 生成相关问题,如其他轴的拼接,其他堆叠函数,处理不同形状的方法等。</think>在Python中使用NumPy对三维数组按第一维度(axis=0)进行拼接,可以通过`np.concatenate`或`np.vstack`实现。以下是具体方法和示例: --- ### 一、使用`np.concatenate` **语法**: ```python result = np.concatenate((array1, array2, ...), axis=0) ``` **条件**:所有输入数组在非拼接轴(axis≠0)上的维度必须完全一致。 **示例**: ```python import numpy as np # 创建两个3D数组,形状均为(2,3,4) arr1 = np.arange(24).reshape(2,3,4) arr2 = np.arange(24,48).reshape(2,3,4) # 沿axis=0拼接 result_concat = np.concatenate((arr1, arr2), axis=0) print(result_concat.shape) # 输出:(4, 3, 4) ``` --- ### 二、使用`np.vstack` **语法**: ```python result = np.vstack((array1, array2, ...)) ``` **原理**:`vstack`内部调用`concatenate`并指定`axis=0`,因此适用于垂直堆叠。 **示例**: ```python result_vstack = np.vstack((arr1, arr2)) print(result_vstack.shape) # 输出同样为(4, 3, 4) ``` --- ### 三、关键区别 1. **灵活性**:`concatenate`可指定任意轴(如axis=1或axis=2),而`vstack`仅支持axis=0。 2. **输入维度**:`vstack`要求输入数组在非拼接轴上的维度完全一致,而`concatenate`需手动确保维度匹配[^2][^4]。 --- ### 四、处理不同形状的数组 若数组在非拼接轴上维度不一致,需先调整形状。例如将形状为`(3,2,4)`和`(5,2,4)`的数组拼接后,结果形状为`(8,2,4)`。若维度不匹配,需使用`reshape`或切片统一维度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值