User:Xyy23330121/Python/科学计算/数组
数组是 numpy 中,表示矩阵或向量的工具。本章节的代码均以下面代码开头。
import numpy as np
本章将讲述数组作为容器对象的一些基本操作。
创建数组
编辑最基本的创建数组的方法,是使用 np.array 将列表转化为数组。
a = np.array([1,2,3,4,5,6])
b = np.array(
[[1,2],
[3,4],
[5,6]]
)
c = np.array(
[[[ 1, 2],
[ 3, 4]],
[[ 5, 6],
[ 7, 8]],
[[ 9,10],
[11,12]]]
)
数组的形状
编辑数组是具有形状的,我们可以使用 shape,ndim和size属性来确定数组的形状。
#shape 代表数组的维数,以及每个维度的分量个数
print(a.shape) #输出:(6, )
print(b.shape) #输出:(3, 2)
print(c.shape) #输出:(3, 2, 2)
#ndim 代表数组的维数
print(a.ndim) #输出:1
print(b.ndim) #输出:2
print(c.ndim) #输出:3
#size 代表数组的总数据量
print(a.size) #输出:6
print(b.size) #输出:6
print(c.size) #输出:12
调整数组的形状
编辑ndarray.T https://numpy.org/doc/stable/reference/generated/numpy.ndarray.T.html#numpy.ndarray.T ndarray.flat https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flat.html#numpy.ndarray.flat
https://numpy.org/doc/stable/reference/arrays.ndarray.html#shape-manipulation
https://numpy.org/doc/stable/reference/constants.html#numpy.newaxis
https://numpy.org/doc/stable/reference/routines.array-manipulation.html#changing-array-shape
数组与索引
编辑一维数组
编辑一维数组和列表使用相似的方法进行索引。
print(a[0]) #输出:1
print(a[0:]) #输出:[1 2 3 4 5 6]
print(a[:1]) #输出:[1]
print(a[2:4]) #输出:[3 4]
print(a[::2]) #输出:[1 3 5]
但需要注意,列表经 slice 索引时,创建的是切片部分的副本——更改副本不改变原列表的内容。而数组所创建的则是对原数组的引用——更改引用会更改原数组的内容。比如:
d = [1,2,3,4,5,6] #创建列表
d2 = d[2:4]
d2[0] = 9
print(d,d2) #输出:[1, 2, 3, 4, 5, 6] [9, 4]
更改子列表副本,并未更改原列表的内容。而:
a2 = a[2:4]
a2[0] = 9
print(a,a2) #输出:[1 2 9 4 5 6] [9 4]
原数组的内容也被更改。这是为了计算时方便而定的。
多维数组
编辑多维数组的索引方式与多维列表相似,又有较大的不同。我们看以下示例:
print(b[0]) #输出:[1 2]
print(b[1,1]) #输出:4
print(b[1,:]) #输出:[3 4]
print(b[:,1]) #输出:[2 4 6]
print(c[1]) #输出:[[5 6]
# [7 8]]
print(c[1,1]) #输出:[7 8]
print(c[1,1,1]) #输出:9
print(c[1,:,1]) #输出:[6 8]
在进行索引时,与一维数组类似,如果索引得到的结果为 np.array 类型,则结果仅为原数组的引用,而非原数组的副本。
c1 = c[1,1] #得到的对象类型:np.array
c1[1] = 9
print(c[1,1]) #输出:[7 9]
c2 = c[1,1,1] #得到的对象类型:int
c2 = 8
print(c[1,1]) #输出:[7 9]
特殊索引方式
编辑数组支持输入一个由布尔值组成的数组作为其索引,比如:
a = np.array([1,2,3,4,5,6,7,8])
b = np.array([8,7,6,5,4,3,2,1])
#利用数组和整数的比较运算,创建由布尔值组成的数组。
#数组和数字,数组和数组的运算将在下一章讲解。数组内数据类型将在本页最下面讲解。
print(a<5) #输出:[ True True True True False False False False]
#用该数组进行索引。
print(a[a<5]) #输出:[1 2 3 4]
print(b[a<5]) #输出:[8 7 6 5]
此时,要求作为索引的布尔值数组,其size属性和被索引数组的size属性相等。
https://numpy.org/doc/stable/reference/arrays.ndarray.html#item-selection-and-manipulation
特殊数组的创建
编辑一些常用数组无需使用列表来创建,比如:
d = np.zeros(2) #形状为(2, )的全零数组。
e = np.zeros(2,2) #形状为(2, 2)的全零数组。
f = np.ones(2) #形状为(2, )的全一数组。
g = np.ones(2,2) #形状为(2, 2)的全一数组。
除此之外,还有类似 slice 索引的:
h = np.arange(4) #[0 1 2 3]
i = np.arange(2,4) #[2 3]
j = np.arange(1,7,2) #[1 3 5]
k = np.arange(0, 1, 0.3) #[0 0.3 0.6 0.9]
以及用于线性采样的:
l = np.linspace(0, 10, num=5) #5个数字组成的等差数组,起始为0,终止为10
#[0 2.5 5 7.5 10]
#即:在0~10之间取样5个点。
https://numpy.org/doc/stable/reference/routines.array-creation.html
https://numpy.org/doc/stable/user/quickstart.html#quickstart-array-creation
数组的转换
编辑https://numpy.org/doc/stable/reference/arrays.ndarray.html#array-conversion