Numpy 中一维数组的操作

In [1]:
import numpy as np
np.__version__
Out[1]:
'1.24.4'

向量初始化

普通初始化

In [2]:
a = np.array([1., 2., 3.])
a
Out[2]:
array([1., 2., 3.])
In [3]:
a.dtype
Out[3]:
dtype('float64')
In [4]:
a.shape
Out[4]:
(3,)
In [5]:
b = np.zeros(3, dtype=np.int32)
(b, b.dtype, b.shape)
Out[5]:
(array([0, 0, 0], dtype=int32), dtype('int32'), (3,))
In [6]:
c = np.zeros_like(a)
(c, c.dtype, c.shape)
Out[6]:
(array([0., 0., 0.]), dtype('float64'), (3,))

由于在数组末尾没有预留空间以快速添加新元素,Numpy 数组无法像 Python 列表那样增长。因此,通常的处理方式包括:

  • 在变长 Python 列表中准备好数据,然后将其转换为 Numpy 数组
  • 使用 np.zeros 预先分配必要的空间 (如上 b 向量)
  • 使用 np.zeros_like 创建一个与某一变量形状一致的空数组。(如上 c 向量)

不止零数组,还有以下方法

In [7]:
np.ones(3)
Out[7]:
array([1., 1., 1.])
In [8]:
np.ones_like(a)
Out[8]:
array([1., 1., 1.])
In [9]:
np.empty(3)
Out[9]:
array([1., 1., 1.])
In [10]:
np.empty_like(a)
Out[10]:
array([1., 1., 1.])
In [11]:
np.full(3, 7.)
Out[11]:
array([7., 7., 7.])
In [12]:
np.full_like(a, 7.)
Out[12]:
array([7., 7., 7.])

单调序列初始化

还可以通过单调序列初始化数组,基本语法如下

np.arange(start, stop, step)
np.linspace(start, stop, num)
In [13]:
np.arange(6)
Out[13]:
array([0, 1, 2, 3, 4, 5])
In [14]:
np.arange(2, 6)
Out[14]:
array([2, 3, 4, 5])
In [15]:
np.arange(1, 6, 2)
Out[15]:
array([1, 3, 5])
In [16]:
np.linspace(0, 0.5, 6)
Out[16]:
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5])

随机初始化

均匀分布,

In [17]:
np.random.randint(0, 10, 3)
Out[17]:
array([4, 3, 3])
In [18]:
np.random.uniform(0, 10, 3)
Out[18]:
array([7.73271469, 9.3142745, 8.50904712])

均匀分布,

In [19]:
np.random.rand(3)
Out[19]:
array([0.77319296, 0.85345566, 0.58323885])

正态分布,,

In [20]:
np.random.randn(3)
Out[20]:
array([ 0.07832833, -0.23126898,  1.32335257])

正态分布,,

In [21]:
np.random.normal(5, 2, 3)
Out[21]:
array([3.33488243, 8.16109442, 4.74846442])

向量索引

In [22]:
a = np.arange(1, 6)
a
Out[22]:
array([1, 2, 3, 4, 5])
In [23]:
a[1]
Out[23]:
2
In [24]:
a[2:4]
Out[24]:
array([3, 4])
In [25]:
a[-2:]
Out[25]:
array([4, 5])
In [26]:
a[::2]
Out[26]:
array([1, 3, 5])
In [27]:
a[[1,3,4]]
Out[27]:
array([2, 4, 5])

所有索引方法本质上都是 views: 它们并不存储数据,如果原数组在被索引后发生更改,则会反映出原始数组中的更改。如果需要复制数组,可以用 copy 方法。

In [28]:
b = a.copy()
a[2:4] = 0
a
Out[28]:
array([1, 2, 0, 0, 5])
In [29]:
b
Out[29]:
array([1, 2, 3, 4, 5])

向量运算

基础运算

得益于 Numpy 的广播特性,这里就不一一举例了

向量内积和外积

In [30]:
a = np.array([1, 2])
b = np.array([3, 4])
np.dot(a, b)
Out[30]:
11
In [31]:
np.cross(a, b)
Out[31]:
array(-2)

常用函数

In [32]:
np.sqrt([4, 9])
Out[32]:
array([2., 3.])
In [33]:
e = np.exp([1, 2])
e
Out[33]:
array([2.71828183, 7.3890561 ])
In [34]:
np.log(e)
Out[34]:
array([1., 2.])
In [35]:
np.sin([np.pi, np.pi/2])
Out[35]:
array([1.2246468e-16, 1.0000000e+00])
In [36]:
np.arcsin([0, 1])
Out[36]:
array([0.        , 1.57079633])
In [37]:
np.max([1, 2, 3])
Out[37]:
3
In [38]:
np.argmax([1, 2, 3])
Out[38]:
2

参考资料