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])

posted on 2022-04-01 22:44  饮冰未  阅读(258)  评论(0编辑  收藏  举报