Numpy的ndarray:一种多维数组对象
N维数组对象,该对象是一个快速而灵活的大数据集容器,nadarry是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的。每个数组都有一个shape(表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象)
import numpy as np
# 创建ndarry
# 创建数组最简单的方法就是使用array函数,它接受一切序列型的对象
data1 = [6,7.5,8,0,1]
# 然后产生一个新的含有传入数据的NumPy数组
arr1 = np.array(data1)
arr1
array([6. , 7.5, 8. , 0. , 1. ])
# 嵌套序列将会被转换为一个多维数组
data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)
arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
arr2.shape # 形状 二维数组,每一个维度4个值
(2, 4)
# np.array会尝试为新建的这个数组推断出一个较为合适的数据类型,保存在一个特殊的dtype对象中
arr1.dtype
dtype('float64')
arr2.dtype
dtype('int32')
# 除np.array之外,还有一些函数也可以新建数组
# 见词知意,新建10个全是0的数组
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
# 见词知意,新建10个全是1的数组
np.ones(10)
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
np.zeros((3,5))
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
# empty不是见名知意了,它返回的都是一些未初始化的垃圾值
np.empty((3,5,2))
array([[[1.22955771e-311, 9.58487353e-322],
[0.00000000e+000, 0.00000000e+000],
[0.00000000e+000, 5.02034658e+175],
[4.66725104e-062, 4.01832345e-057],
[9.51657595e+169, 3.34722073e-033]],
[[1.47763641e+248, 1.16096346e-028],
[7.69165785e+218, 1.35617292e+248],
[3.10139001e+179, 9.15011178e-071],
[1.13823902e-042, 1.33689723e+165],
[4.30420903e-096, 6.32299154e+233]],
[[6.48224638e+170, 5.22411352e+257],
[5.74020278e+180, 8.37174974e-144],
[1.41529402e+161, 9.16651763e-072],
[4.10024115e+097, 5.06265680e-038],
[3.75559122e+126, 1.58268989e-319]]])
函数 | 说明 |
---|---|
array | 将输入数据(列表、元组、数组或其他序列类型)转为ndarray。要么推断出dtype,要么显式指定dtype |
asarray | 将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制 |
arange | 类似于内置的range,但返回的是一个ndarray而不是列表 |
ones、ones_like | 根据指定的形状和dtype创建一个全1数组。ones_like以另一个数组为参数,并根据其形状和dtype创建一个全1数组 |
zeros、zeros_like | |
empty、empty_like | 创建新数组,只分配内存空间但不填充任何值 |
eye、identity | 创建一个正方的N*N单位矩阵(对角线为1,其余为0) |
# asarray将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制
np.asarray([1,2,3,4,5])
array([1, 2, 3, 4, 5])
#array将输入数据(列表、元组、数组或其他序列类型)转为ndarray。要么推断出dtype,要么显式指定dtype
# 指定dtype
arr3 = np.array([1,2,3],dtype = np.float64)
arr3.dtype
dtype('float64')
arr4 = np.array([4,5,6],dtype = np.int32)
arr4.dtype
dtype('int32')
numpy的数据类型
类型 | 类型代码 | 说明 |
---|---|---|
int8、uint | i1、u1 | 有符号和无符号的8位整型 |
int16、uint16 | i2、u2 | 有符号和无符号的16位整型 |
int32、uint32 | i4、u4 | |
int64、uint64 | i8、u8 | |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准的双精度浮点数 |
float64 | f8或d | 标准的双精度浮点数 |
float128 | f16或g | 扩展精度浮点数 |
complex64、complex128、complex256 | c8、c16、c32 | 分别用两个32位、64位或128位浮点数表示的复数 |
object | O | Python对象类型 |
string_ | S | 固定的长度的字符串类型(每个字符1个字节),例如要创建一个长度为10的字符串,应使用S10 |
unicode_ | U | 固定长度的unicode类型(U10) |
# 显式转换dtype
arr6 = np.array([1,2,3,4,5])
dtype('int32')
arr6.dtype
dtype('float64')
# 如果将浮点数转换成整数,则小数部分将会被截断
arr8 = np.array([3.7,-1.2,2.6,0.5,12.9,10.1])
arr8.dtype
dtype('float64')
arr9 = arr8.astype(np.int32)
arr9.dtype
arr9
array([ 3, -1, 2, 0, 12, 10])
# 如果某字符串数组表示的全是数字,也可以转换为数值形式
arr10 = np.array(['1.25','-9.6','42'], dtype = np.string_)
arr10
array([b'1.25', b'-9.6', b'42'], dtype='|S4')
arr11 = arr10.astype(np.float32)
arr11
array([ 1.25, -9.6 , 42. ], dtype=float32)
# 数组的dytpe另一个用法
int_array = np.arange(10)
int_array
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
calibers = np.array([.22,.270,.357,.44,50],dtype = np.float64)
# 复制类型
int_array.astype(calibers.dtype)
# 调用astype无论如何都会创建一个新的数组(原始数据的一份拷贝),即使dtype跟老dtype相同也是如此
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
数组和标量之间的运算
数组的意义是让你不写循环即可完成数据批量运算,这通常叫矢量化
大小相等的数组之间的任何运算都会将运算应用到元素级
不同大小的数组之间的运算叫做广播
arr12 = np.array([[1.,2.,3.],[4.,5.,6.]])
arr12
array([[1., 2., 3.],
[4., 5., 6.]])
arr12 * arr12
array([[ 1., 4., 9.],
[16., 25., 36.]])
arr12 - arr12
array([[0., 0., 0.],
[0., 0., 0.]])
1 / arr12
array([[1. , 0.5 , 0.33333333],
[0.25 , 0.2 , 0.16666667]])
arr12 ** 0.5
array([[1. , 1.41421356, 1.73205081],
[2. , 2.23606798, 2.44948974]])