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,ndimsize属性来确定数组的形状。

#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