前言
接着上一篇文章对NumPy的N维数组ndarray的一些知识点再进行更进一步的学习与记录。
提示:以下是本篇文章正文内容,下面案例可供参考
1.2 ndarry的数据类型
array的数据类型(dtype),dtype是NumPy能够与其他系统数据灵活交互的原因。数据的dtype通常都是按照一个方式命名:类型名,比如float和int,后面再接上表明每个元素位数的数字。具体可参照下表所示:
类型 | 类型代码 | 描述 |
---|
int8,uint8 | i1, u1 | 有符号和无符号的8位整数 | int16, uint16 | i2, u2 | 有符号和无符号的16位整数 | int32, uint32 | i4, u4 | 有符号和无符号的32位整数 | int62 ,uint64 | i8 ,u8 | 有符号和无符号的64位整数 | float16 | f2 | 半精度浮点数 | float32 | f4或f | 标准单精度浮点数;兼容C语言float | float64 | f8或d | 标准双精度浮点数;兼容C语言double和 python float | float128 | f16或g | 拓展精度浮点数 | complex64,complex128,complex256 | c8, c16, c32 | 分别基于32位、64位、128位浮点数的复数 | bool | ? | 布尔值,存储True或False | object | O | Python object类型 | string_ | S | 修正的ASCⅡ字符串类型;例如生成一个长度为10的字符串类型,使用‘S10’ | unicode_ | U | 修正的Unicode类型;例如生成一个长度为10的Unicode类型,使用‘U10’ |
array的数据类型可以根据关键字参数dtype=改变,实例代码如下:
arr1 = np.array([1, 2, 3, 4, 5],dtype=np.int64)
print(arr1.dtype)
-------------------------------------------------
int64
也可以使用astype方法转换数组的数据类型
arr2 = arr1.astype(np.float64)
print(arr2.dtype)
------------------------------------------------
float64
在任意使用数据类型转换时要注意以下几点: 1)整数–>浮点型,数字末尾加小数点
arr1 = np.array([1, 2, 3, 4, 5], dtype=np.float64)
print(arr1)
print(arr1.dtype)
-------------------------------------------------
[1. 2. 3. 4. 5.]
float64
2)浮点型–>整数,小数点后的部分将被消除
arr1 = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr2 = arr1.astype(np.int32)
print(arr2)
--------------------------------------------------
[ 3 -1 -2 0 12 10]
3)数字含义的字符串 --> 数字(整型或者浮点型)
arr1 = np.array(['1.25', '-9.6', '42'],dtype=np.string_)
arr2 = arr1.astype(float)
print(arr2)
---------------------------------------------------
[ 1.25 -9.6 42. ]
1.3 NumPy数组算术
数组允许你进行批量操作而无须任何for循环。NumPy用户称这种特性为向量化。任何在两个等尺寸数组之间的算术操作都应用了逐元素操作的方式。
arr = np.array([[1.,2.,3.],[4.,5.,6.]])
arr1 = arr * arr
print(arr1)
---------------------------------------------
[[ 1. 4. 9.]
[16. 25. 36.]]
而有趣的是,同尺寸数组之间的比较会产生一个布尔值数组。
arr2 = np.array([[0., 4., 1.], [6., 9., 5.]])
arr1 = arr2 > arr
print(arr1)
---------------------------------------------
[[False True False]
[ True True False]]
1.4 基础索引与切片
NumPy中数组的索引与切片操作和Python的列表的索引与切片的操作很类似,而不同点在如果你传入了一个数值给数组的切片,数值会被传递到整个切片当中。区别于Python的内建列表,数组的切片是原数组的视图。这意味着数据并不是被复制了,任何对于视图的修改都会反映到原数组上。我们可以从下面的实验看到这个现象:
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
arr = np.array(list)
print(list)
print(arr)
print('--------------------------------1')
list_slice = list[5:8]
arr_slice = arr[5:8]
print(list_slice)
print(arr_slice)
print('--------------------------------2')
arr_slice[1] = 12345
list_slice[1] = 12345
print(list_slice)
print(arr_slice)
print(list)
print(arr)
print('--------------------------------3')
------------------------------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0 1 2 3 4 5 6 7 8 9]
--------------------------------1
[5, 6, 7]
[5 6 7]
--------------------------------2
[5, 12345, 7]
[ 5 12345 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[ 0 1 2 3 4 5 12345 7 8 9]
--------------------------------3
arr_slice不写切片值的[:]将会引用数组的所有值:
arr_slice[:] = 64
print(arr)
------------------------------------------------------------
[ 0 1 2 3 4 64 64 64 8 9]
如果你想要的是一份数组的拷贝而不是视图可以使用.copy()。
aa = arr[5:8].copy()
aa[:] = 99
print(arr)
------------------------------------------------------------
[ 0 1 2 3 4 64 64 64 8 9]
在一个一维数组中,每个索引值对应的元素是一个值;而再二维数组中,每个索引值对应的元素不再是一个值,而是一个一维数组。
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a = arr2d[2]
print(a)
---------------------------------------------------------
[7 8 9]
你可以通过传递一个索引的逗号分隔列表去选择单个元素。或者是类似c语言二维数组的索引方式。
a = arr2d[0,1]
print(a)
a = arr2d[0][1]
print(a)
-----------------------------------------------------------
2
2
1.4.1 二维数组的切片索引
对于二维数组的切片与一维数组的切片有所不同。
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
a = arr2d[:2]
print(a)
------------------------------------------------------------
[[1 2 3]
[4 5 6]]
表达式arr2d[:2]的含义为选择arr2d的前两行。 想要进行多组切片,其实与多组索引类似([行,列])
a = arr2d[:2,1:]
print(a)
------------------------------------------------------------
[[2 3]
[5 6]]
如果将索引和切片混合,就可以得到低维度的切片。 例如我们可以选择第三行,只选择后两列
a = arr2d[2,1:]
print(a)
------------------------------------------------------------
[8 9]
我们还可以选择第三列,但是只选择第二行
a = arr2d[:2,2]
print(a)
------------------------------------------------------------
[3 6]
需要注意的是,单独一个冒号表示选择整个轴上的数组。
a = arr2d[2:,:]
print(a)
a = arr2d[2,:]
print(a)
------------------------------------------------------
[[7 8 9]]
[7 8 9]
第二天下班!!!!
|