import numpy as np
x = np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
X = np.arange(15).reshape(3, 5)
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
基本属性
x.ndim
#查看数组维度
1
X.ndim
2
x.shape
#返回类型是一个元组。说明该数组是一维数组,包含10个元素
(10,)
X.shape
#说明该数组是二维数组,3行5列
(3, 5)
x.size
#表示元素个数
10
X.size
15
numpy.array数据的访问
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[3]
3
x[-1]
9
X[2, 3]
#numpy中建议这种形式的数据索引
13
x[0:5]
#切片操作,不包含终止位
array([0, 1, 2, 3, 4])
x[4:]
array([4, 5, 6, 7, 8, 9])
x[:]
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#也可加入步长
x[::2]
array([0, 2, 4, 6, 8])
x[0:7:2]
array([0, 2, 4, 6])
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
# 取X的前2行前3列
X[:2, :3]
array([[0, 1, 2],
[5, 6, 7]])
#不可以用X[:2][:3]的格式,这是取了X[:2]这个数组中的前三个元素结果如下,而X[:2]中只有两个元素,所以只取到了如下的结果
X[:2]
X[:2][:3]
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
#访问矩阵的前2行中,每行步长为2的元素
X[:2, ::2]
array([[0, 2, 4],
[5, 7, 9]])
X[::-1, ::-1]
#将整个矩阵翻转过来
array([[14, 13, 12, 11, 10],
[ 9, 8, 7, 6, 5],
[ 4, 3, 2, 1, 0]])
X[0]
array([0, 1, 2, 3, 4])
X[0, :]
#只取第一行
array([0, 1, 2, 3, 4])
X[0, :].ndim
#此时的X[0, :]为一维数组
1
X[:, 0]
#只取第一列
array([ 0, 5, 10])
X[:, 0].ndim
1
子矩阵的修改会影响到原矩阵
subX = X[:2, :3]
subX
array([[0, 1, 2],
[5, 6, 7]])
subX[0, 0] = 888
subX
array([[888, 1, 2],
[ 5, 6, 7]])
X
array([[888, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14]])
同样原矩阵修改也会影响子矩阵
X[0, 0] = 0
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
subX
array([[0, 1, 2],
[5, 6, 7]])
要想子矩阵和原矩阵互不影响,调用格式为 subX = X[:2, :3].copy()
subX = X[:2, :3].copy()
subX
array([[0, 1, 2],
[5, 6, 7]])
subX[0, 0] = 888
subX
array([[888, 1, 2],
[ 5, 6, 7]])
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
reshape
x.shape
#x是一位数组,只有10个元素
(10,)
#把x变成一个2行5列的矩阵
x.reshape(2, 5)
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
使用reshape函数并没有改变x数组本身
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
想要保留这种改变,则需要另一个变量来承接
a = x.reshape(2, 5)
a
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
也可以将x修改为一个二维的数组
b = x.reshape(1, 10)
b
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
注意此时的数组中是2个方括号
b.shape
(1, 10)
b.ndim
2
只指定行数,而不指定列数,可以用如下调用格式
b = x.reshape(10, -1)
b
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
b = x.reshape(2, -1)
b
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
同理只指定列数,而不指定行数,可以用如下调用格式
b = x.reshape(-1, 10)
b
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
b = x.reshape(-1, 5)
b
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
合并操作
x = np.array([1, 2, 3])
x
array([1, 2, 3])
y = np.array([4, 5, 6])
y
array([4, 5, 6])
#拼接操作
np.concatenate([x, y])
array([1, 2, 3, 4, 5, 6])
# 也可以拼接三个数组
z = np.array([88, 88, 88])
np.concatenate([x, y, z])
array([ 1, 2, 3, 4, 5, 6, 88, 88, 88])
二维数组的拼接
A = np.array([[1, 2, 3],
[4, 5, 6]])
A
array([[1, 2, 3],
[4, 5, 6]])
np.concatenate([A, A])
#默认是按照行来拼接
# 可以理解为矩阵A有2个样本,每个样本有三个特征值,拼接后变为4个样本
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
np.concatenate([A, A], axis = 1)
#默认的axis = 0,按行拼接,axis = 1,按列拼接
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
二维数组和一维数组不能直接用np.concatenate拼接,因为维度不同,所以需要使用reshape
B = np.concatenate([A, z.reshape(1, -1)])
B
array([[ 1, 2, 3],
[ 4, 5, 6],
[88, 88, 88]])
也可以使用np.vstack()进行直接拼接
B = np.vstack([A, z])
#v表示vertical竖直方向拼接
B
array([[ 1, 2, 3],
[ 4, 5, 6],
[88, 88, 88]])
np.hstack() 水平方向的拼接
B = np.full(shape = (2, 2), fill_value = 555)
B
array([[555, 555],
[555, 555]])
np.hstack([A, B])
array([[ 1, 2, 3, 555, 555],
[ 4, 5, 6, 555, 555]])
分割操作
a = np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a1, a2, a3 = np.split(a, [3, 7])
#np.split()中第一个参数是切割对象,第二个参数是切割点
#[3, 7]表示0-3, 3-7, 7-9,包前不包后
a1
array([0, 1, 2])
a2
array([3, 4, 5, 6])
a3
array([7, 8, 9])
a1, a2 = np.split(a, [5])
a1
array([0, 1, 2, 3, 4])
a2
array([5, 6, 7, 8, 9])
分割二维数组
A = np.arange(16).reshape(4, 4)
A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
A1, A2 = np.split(A, [1])
#分割矩阵的行
A1
array([[0, 1, 2, 3]])
A2
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
A1, A2 = np.split(A, [1], axis = 1)
#axis默认为0,分割行,axis = 1,分割列
A1
array([[ 0],
[ 4],
[ 8],
[12]])
A2
array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11],
[13, 14, 15]])
竖直分割矩阵和水平分割矩阵
upper, lower = np.vsplit(A, [1])
upper
array([[0, 1, 2, 3]])
lower
array([[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
left, right = np.hsplit(A, [3])
left
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]])
right
array([[ 3],
[ 7],
[11],
[15]])
数据分割的意义在于,分割样本特征值和标签
data = np.arange(16).reshape(4, 4)
data
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
#例如最后一列是标签
x, y = np.hsplit(data, [-1])
x
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]])
y
array([[ 3],
[ 7],
[11],
[15]])
y[:, 0]
array([ 3, 7, 11, 15])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix