默默无名的西大研究生学习的第二天——NumPy2


前言

接着上一篇文章对NumPy的N维数组ndarray的一些知识点再进行更进一步的学习与记录。


提示:以下是本篇文章正文内容,下面案例可供参考

1.2 ndarry的数据类型

array的数据类型(dtype),dtype是NumPy能够与其他系统数据灵活交互的原因。数据的dtype通常都是按照一个方式命名:类型名,比如float和int,后面再接上表明每个元素位数的数字。具体可参照下表所示:

类型类型代码描述
int8,uint8i1, u1有符号和无符号的8位整数
int16, uint16i2, u2有符号和无符号的16位整数
int32, uint32i4, u4有符号和无符号的32位整数
int62 ,uint64i8 ,u8有符号和无符号的64位整数
float16f2半精度浮点数
float32f4或f标准单精度浮点数;兼容C语言float
float64f8或d标准双精度浮点数;兼容C语言double和 python float
float128f16或g拓展精度浮点数
complex64,complex128,complex256c8, c16, c32分别基于32位、64位、128位浮点数的复数
bool?布尔值,存储True或False
objectOPython 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]

第二天下班!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值