结构数组,首先需要定义结构,然后利用np.array()来创建数组,其参数dtype为定义的结构。
import numpy as np
personType = np.dtype({
'names': ['name', 'age', 'weight'],
'formats': ['U30', 'i8', 'f8']})
a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
dtype=personType)
print(a, type(a))
# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
#
print(a['name'])
#['Liming' 'Mike' 'Jan']
import numpy as np
personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')])
a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
dtype=personType)
print(a, type(a))
# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
#
# 结构数组的取值方式和一般数组差不多,可以通过下标取得元素:
print(a[0])
# ('Liming', 24, 63.9)
print(a[-2:])
# [('Mike', 15, 67. ) ('Jan', 34, 45.8)]
# 我们可以使用字段名作为下标获取对应的值
print(a['name'])
# ['Liming' 'Mike' 'Jan']
print(a['age'])
# [24 15 34]
print(a['weight'])
# [63.9 67. 45.8]
如果想抽取(或查看)数组的一部分,必须使用切片语法,也就是,把几个用冒号( start:stop:step )隔开的数字置于方括号内。
当了解不明确指明起始和结束位置的情况时,如省去第一个数字,numpy 会认为第一个数字是0;如省去第二个数字,numpy 则会认为第二个数字是数组的最大索引值;如省去最后一个数字,它将会被理解为1,也就是抽取所有元素而不再考虑间隔。
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
print(x[::2]) #[1 3 5 7]
print(x[::-1]) # [8 7 6 5 4 3 2 1]
print(x[::-2]) # [8 6 4 2]
对于二维数组,在数组所对应的方括号内存在一逗号,逗号前表示对于行的操作,逗号后表示对于列的操作,如果没有逗号则默认表示对于行的操作。
import numpy as np
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
print(x[1:5:2])
# [[16 17 18 19 20]
# [26 27 28 29 30]]
print(x[2:])
# [[21 22 23 24 25]
# [26 27 28 29 30]
# [31 32 33 34 35]]
print(x[::2, ::3])
# [[11 14]
# [21 24]
# [31 34]]
NumPy 允许使用…表示足够多的冒号来构建完整的索引列表。
import numpy as np
x = np.random.randint(1, 100, [2, 2, 3])
print(x)
# [[[ 5 64 75]
# [57 27 31]]
#
# [[68 85 3]
# [93 26 25]]]
print(x[1, ...])
# [[68 85 3]
# [93 26 25]]
print(x[..., 2])
# [[75 31]
# [ 3 25]]
我们可以通过一个布尔数组来索引目标数组。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
print(len(x)) # 50
plt.plot(x, y)
mask = y >= 0
print(len(x[mask])) # 25
print(mask)
'''
[ True True True True True True True True True True True True
True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False]
'''
plt.plot(x[mask], y[mask], 'bo')
mask = np.logical_and(y >= 0, x <= np.pi / 2)
print(mask)
'''
[ True True True True True True True True True True True True
True False False False False False False False False False False False
False False False False False False False False False False False False
False False False False False False False False False False False False
False False]
'''
plt.plot(x[mask], y[mask], 'go')
plt.show()
除了for循环,Numpy 还提供另外一种更为优雅的遍历方法。
apply_along_axis(func1d, axis, arr)
参数简析:
funcld:计算函数,如加和(np.sum)、求平均值(np.mean)等。
axis:表示坐标轴,在二维数组里有-1、0、1,其中1,-1代表纵方向,0代表横方向。
arr:表示待处理的数组。
import numpy as np
x = np.array([[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
[26, 27, 28, 29, 30],
[31, 32, 33, 34, 35]])
y = np.apply_along_axis(np.sum, 0, x)
print(y) # [105 110 115 120 125]
y = np.apply_along_axis(np.sum, 1, x)
print(y) # [ 65 90 115 140 165]
numpy.ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。我们可以通过修改shape来改变数组的形状。
numpy.reshape(a, newshape[, order=‘C’]) 在不更改数据的情况下为数组赋予新的形状。当参数newshape = -1时,表示将数组降为一维。
numpy.transpose(a, axes=None) 可以进行数组的专职
当创建一个数组之后,还可以给它增加一个维度,这在矩阵计算中经常会用到。
import numpy as np
x = np.array([1, 2, 9, 4, 5, 6, 7, 8])
print(x.shape) # (8,)
print(x) # [1 2 9 4 5 6 7 8]
y = x[np.newaxis, :]
print(y.shape) # (1, 8)
print(y) # [[1 2 9 4 5 6 7 8]]
y = y[np.newaxis, :]
print(y.shape) # (1, 1, 8)
print(y) # [[[1 2 9 4 5 6 7 8]]]
y = x[:, np.newaxis]
print(y.shape) # (8, 1)
print(y)
# [[1]
# [2]
# [9]
# [4]
# [5]
# [6]
# [7]
# [8]]
numpy.squeeze(a, axis=None) 从数组的形状中删除单维度条目,即把shape中为1的维度去掉。
a表示输入的数组;
axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
import numpy as np
x = np.arange(10)
print(x,x.shape) # [0 1 2 3 4 5 6 7 8 9] (10,)
x = x[np.newaxis, :]
print(x,x.shape) # [[0 1 2 3 4 5 6 7 8 9]] (1, 10)
y = np.squeeze(x)
print(y,y.shape) # [0 1 2 3 4 5 6 7 8 9] (10,)
numpy.concatenate((a1, a2, …), axis=0, out=None) 提供了将多个数组拼接到一起的功能
***numpy.vstack(tup)*表示竖直(列)的拼接方式
numpy.hstack(tup)表示水平(行)的拼接方式
上述两种拼接方式在数据维度等于1时,比较特殊。而当维度大于或等于2时,它们的作用相当于concatenate,用于在已有轴上进行操作。
numpy.split(ary, indices_or_sections, axis=0) 提供将一个数组拆分为多个数组的功能,其中indices_or_sections 参数是返回数组的形状
numpy.vsplit(ary, indices_or_sections) 表示竖直(列)的拆分方式
numpy.hsplit(ary, indices_or_sections) 表示水平(行)的拆分方式
以上便是本人在学习Numpy数组过程中总结的所有陌生的知识点,对于其中略写的部分,有些是因为在前期的实践中已经可以达到熟用的程度,有些是尚未接触到需要使用的领域的知识,如果在今后的研究中需要使用,我也一定会返回来将略写部分的知识进行详细的扩充与代码说明。
如果您在阅读过程中发现了本文的不足或者错误,请您在下方留言以批评指正,本人一定及时修改。感谢您阅读本文!