创建数组对象
NumPy提供了两种基本的对象:ndarray(N-dimensional Array Object)和ufunc(Universal Function Object)。 ndarray(下文统一称为数组)是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。
1. 数组属性
为了更好地理解和使用数组,了解数组的基本属性是十分有必要的。
属性 | 说明 |
---|
ndim | 返回 int。表示数组的维数 | shape | 返回 tuple。表示数组的尺寸,对于 n 行 m 列的矩阵,形状为(n,m) | size | 返回 int。表示数组的元素总数,等于数组形状的乘积 | dtype | 返回 data-type。描述数组中元素的类型 | itemsize | 返回 int。表示数组的每个元素的大小(以字节为单位)。 |
2.数组创建
array 函数
NumPy提供的array 函数可以创建一维或多维数组,基本使用语法如下。
numpy.array(object, dtype=None, copy=True, order='K',subok=False, ndmin=0)
array 函数的主要参数及其说明如下表所示。
参数名称 | 说明 |
---|
object | 接收array。表示想要创建的数组。无默认。 | dtype | 接收data-type。表示数组所需的数据类型。如果未给定,则选择保存对象所需的最小类型。默认为None。 | ndmin | 接收int。指定生成数组应该具有的最小维数。默认为None。 |
案例:展示创建一维数组与多维数组并查看数组属性
import numpy as np
arr1 = np.array([1, 2, 3, 4])
print(' 创建的数组为: ',arr1)
创建的数组为: [1 2 3 4]
arr2 = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
print('创建的数组为:\n',arr2)
创建的数组为:
[[ 1 2 3 4]
[ 4 5 6 7]
[ 7 8 9 10]]
print('数组类型为:',arr2.dtype)
print('数组元素个数为:',arr2.size)
print('数组每个元素大小为:',arr2.itemsize)
数组类型为: int32
数组元素个数为: 12
数组每个元素大小为: 4
数组arr1只有一行元素,因此它是一维数组。而数组arr2有3行4列元素,因此它是二维数组,其中第0轴的长度为3(即行数),第1轴的长度为4(即列数)。还可以通过修改数组的shape属性,在保持数组元素个数不变的情况下改变数组每个轴的长度。代码2-2将数组arr2的shape改为(4,3)。注意,从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素的顺序并没有改变。
arr2.shape = 4,3
print('重新设置shape 后的arr2 为:',arr2)
重新设置shape 后的arr2 为: [[ 1 2 3]
[ 4 4 5]
[ 6 7 7]
[ 8 9 10]]
上面的例子都是先创建一个Python序列,然后通过array函数将其转换为数组,这样做显然效率不高。因此NumPy提供了很多专门用来创建数组的函数。
arange 函数
arange 函数类似于 Python 自带的函数range ,通过指定开始值、终值和步长来创建一维数组,创建的数组不含终值。
print('使用arange函数创建的数组为:\n',np.arange(0,1,0.1))
使用arange函数创建的数组为:
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
linspace 函数
linspace 函数通过指定开始值、终值和元素个数来创建一维数组,默认设置包括终值,这一点需要和arange 函数区分。
print('使用linspace函数创建的数组为:',np.linspace(0, 1, 12))
使用linspace函数创建的数组为: [0. 0.09090909 0.18181818 0.27272727 0.36363636 0.45454545
0.54545455 0.63636364 0.72727273 0.81818182 0.90909091 1. ]
logspace 函数
logspace 函数和linspace 函数类似,它创建的是等比数列。
print('使用logspace函数创建的数组为:',np.logspace(0, 2, 20))
使用logspace函数创建的数组为: [ 1. 1.27427499 1.62377674 2.06913808 2.6366509
3.35981829 4.2813324 5.45559478 6.95192796 8.8586679
11.28837892 14.38449888 18.32980711 23.35721469 29.76351442
37.92690191 48.32930239 61.58482111 78.47599704 100. ]
zeros 函数
zeros 函数用来创建值全部为0的数组,即创建的数组值全部填充为0。
print('使用zeros函数创建的数组为:',np.zeros((2,3)))
使用zeros函数创建的数组为: [[0. 0. 0.]
[0. 0. 0.]]
eye 函数
eye 函数用来生成主对角线上的元素为1,其他的元素为0的数组,类似单位矩阵。
diag 函数
diag 函数创建类似对角的数组,即除对角线以外的其他元素都为 0,对角线上的元素可以是0或其他值
ones 函数
ones 函数用来创建元素全部为1的数组,即创建的数组元素全部填充为1。
3.数组数据类型
数据类型
在实际的业务数据处理中,为了更准确地计算结果,需要使用不同精度的数据类型。NumPy 极大程度地扩充了原生 Python 的数据类型,其中大部分的数据类型是以数字结尾的,这个数字表示其在内存中占有的位数。同时需要强调一点,在NumPy中,所有数组的数据类型是同质的,即数组中的所有元素类型必须是一致的。这样做的好处是,更容易确定该数组所需要的存储空间。NumPy的基本数据类型及其取值范围如下表所示。
转换函数
对于NumPy数组中的数据类型,每一种数据类型均有其对应的转换函数。
print('转换结果为:',np.float64(42))
print('转换结果为:',np.int8(42.0))
print('转换结果为:',np.bool(42))
print('转换结果为:',np.bool(0))
print('转换结果为:',np.float(True))
print('转换结果为:',np.float(False))
转换结果为: 42.0 转换结果为: 42 转换结果为: True 转换结果为: False 转换结果为: 1.0 转换结果为: 0.0
案例:存储餐饮企业库存信息
下面将创建一个存储餐饮企业库存信息的数据类型。其中,用一个能存储 40 个字符的字符串来记录商品的名称,用一个 64 位的整数来记录商品的库存数量,最后用一个 64 位的单精度浮点数来记录商品的价格,具体步骤如下。 -(1)创建数据类型。
df = np.dtype([("name", np.str_, 40), ("numitems", np.int64),
("price",np.float64)])
print('数据类型为:',df)
-(2)查看数据类型,可以直接查看或者使用numpy.dtype函数查看,在使用array函数创建数组时,数组的数据类型默认是浮点型。
print('数据类型为:',df["name"])
print('数据类型为:',np.dtype(df["name"]))
自定义数组数据,则可以预先指定数据类型。
itemz = np.array([("tomatoes", 42, 4.14),("cabbages", 13, 1.72)],dtype=df)
print('自定义数据为:',itemz)
|