当前位置:   article > 正文

python astype()_Python数据分析基础:Numpy入门

astype函数python

数组:ndarray

import numpy as np# 创建ndarraydata1 = [6, 7.5, 8, 0 1]arr1 = np.array(data1)# 嵌套序列将会被转换为一个多维数组data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]arr2 = np.array(data2)# 维度arr2.ndim# 形状arr2.shape# 数据类型arr2.dtype# zeros, ones, emptynp.zeros(10)np.empty((2, 3, 2))# arange: range的数组版np.arange(15)# np.eye/np.identity: 创建一个正方的N*N单位矩阵​
de73167a7dd1e11ac83cb361a1fe2224.png
957d8578d90b7397c2b5042ec5660ba2.png
557fabd18107dcb5a2985bca6e6b150b.png

类型转换:astype

arr = np.array([1, 2, 3, 4, 5])float_arr = arr.astype(np.float64)arr1 = np.array([3.7, -1.2, -2.6])int_arr1 = arr1.astype(np.int32)# 如果某字符串数组表示的全是数字,可以用astype转换为数值形式,如果转换失败,会引发一个TypeErrornumeric_strings = np.array(['1.25', '-9.6', '42'], dtype = np.string_)numeric_strings.astype(float) #numpy会自动将python类型映射到等价的dtype上。# 数组的dtype还有另外一种用法int_array = np.arange(10)calibers = np.array([.22, .270, .357, .380, .44, .50], dtype = np.float64)int_array.astype(calibers.dtype)​# 可以用简洁的类型代码来表示dtypeempty_unit32 = np.empty(8, dtype = 'u4')​# 调用astype无论如何都会创建出一个新的数组,即使新dtype和老dtype相同也是如此
  • 大小相等的数组之间的任何算数运算都会将运算应用到元素级;同样,数组与标量的算数运算也会将那个标量值传播到各个元素。
  • 字符编码
5e8955f40f884250120da214291b8095.png

创建自定义数据类型

自定义数据类型是一种异构数据类型,可以当作用来记录电子表格或数据库中一行数据的结构,作为示例,我们将创建一个存储商店库存信息的数据类型。其中,我们用一个长度为40个字符的字符串来记录商品名称,用一个32位的整数来记录商品的库存数量,最后用一个32位的单精度浮点数来记录商品价格。

# 创建数据类型

In [20]: t = dtype([('name', str_, 40), ('numitems', int32), ('price', float32)])

In [21]: t

# '表示将最高位字节存储在最低的内存地址处;第二个字符表示字符编码,如i表示整数;最后的数字表示每个数组元素存储所需要的字节数。

Out[21]: dtype([('name', 'S40'), ('numitems', '

# 查看数据类型

In [22]: t['name']

Out[22]: dtype('S40')

在用array函数创建数组时,如果没有在参数中指定数据类型,将默认为浮点数类型;而如果要创建自定义数据类型的数组,就必须在参数中指定数据类型,否则将触发TypeError。正如前文所述,自定义数据类型,是唯一一种数组内数据允许不同质的情况。

数组的变形、组合和分割

490af08f019245362552eb4a1a9e1700.png
a17c43c250b9c1e833a8961111495a95.png

数组的属性和转换

219fffcb517062125d4a75050610020b.png

数组的索引和切片

  • 基本的索引和切片
# 一维数组从表面上看跟python列表的功能差不多。import numpy as nparr = np.arange(10)arr[5]arr[5:8]arr[5:8] = 12# 将一个标量值赋值给一个切片时,该值会自动传播(广播)到整个选区。# 跟列表最重要的区别在于,数组切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。arr_slice = arr[5:8]arr_slice[1] = 12345arr_slice[:] = 64# 上边两行代码的修改,会直接在数组arr上进行。# 如果想要得到的是ndarray切片的一份副本而非视图,# 就需要显式地进行复制操作,如arr[5:8].copy()。
  • 在多维数组中,如果省略了后面的索引,则返回对象是一个维度低一点的ndarray。
  • 冒号表示选取整个轴。

一维数组的索引和切片

一维数组的切片操作与Python的列表(list)切片操作很相似,例如,我们可以用下标3~7选取元素3~6:

In [23]: a = arange(9)

# a[3:7]代表选取数组a中下标为3,4,5,6的元素。左闭右开,不会选第7个。

In [24]: a[3:7]

Out[24]: array([3, 4, 5, 6])

我们还可以用下标0~7,以2为步长选取元素:

# 如果起始的下标为0,可以省略,但如果要设置步长的话,0和7之间的冒号不能省略。

In [25]: a[:7:2]

Out[25]: array([0, 2, 4, 6])

同时,和Python中一样,我们可以利用负数下标来翻转数组

# 切片可以输入三个数字,用两个冒号隔开,第一个数字是起始下标,第二个数字是结束下标(开区间),第三个数字是步长,如果步长设置为负数,则从后往前取。如果不设置步长的话,第二个冒号可以省略。

In [26]: a[::-1]

Out[26]: array([8, 7, 6, 5, 4, 3, 2, 1, 0])

多维数组的切片和索引

ndarray支持在多维数组上进行切片操作,为了方便起见,我们用一个省略号(...)来表示遍历剩下的维度。

# 用arange函数创建一个数组并改变其维度,使之变成一个三维数组

In [27]: b = arange(24).reshape(2, 3, 4)

# 2*3*4的三维数组

In [28]: b.shape

Out[28]: (2, 3, 4)

In [29]: b

Out[29]:

array([[[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]],

[[12, 13, 14, 15],

[16, 17, 18, 19],

[20, 21, 22, 23]]])

多维数组比较抽象,所以作者用一个树状图来尝试解释一下这一概念。

f9954d48878d6e95af037534363f09a3.png

三维数组b的结构

对于一个多维数组,我们可以假设这是一棵多层的树,每层的编号都是从0开始。这棵树的形状由shape属性得到,在这里b.shape=(2,3,4),这个元组里的元素,依次决定了从最高层到最底层的分叉数目。在切片和索引的时候,我们会从最上层的下标开始,一直选到最底层。如:

#选取三层下标均为0的元素。

b[0, 0, 0]

#选取所有第二层、第三层下标均为0的所有数据。

b[:,0, 0]

#选取最上层下标为0的所有数据。

b[0]

#等价于b[0].

b[0, :, :]

#等价于b[0, :, :],多个冒号可以用一个省略号代替。

b[0, ...]

#选取最上层下标为0,第二层下标为1的所有元素。

b[0, 1]

#针对最上层下标为0,第二层下标为1的所有元素,以步长2选取。

b[0, 1, ::2]

#选取最下层下标为1的所有元素。

b[..., 1]

#选取第二层下标为1的所有元素。

b[:, 1]

#选取最上层下标为0,第三层下标为1的所有元素。

b[0, :, 1]

#选取最上层下标为0,第三层下标最大的所有元素。

b[0, :, -1]

#反向选取最上层下标为0,第三层下标最大的所有元素。

b[0, ::-1, -1]

#以步长2选取最上层下标为0,第三层下标最大的所有元素。

b[0, ::2, -1]

#在最上层做顺序的翻转。

b[::-1]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/730237
推荐阅读
相关标签
  

闽ICP备14008679号