numpy(二)——数据类型

numpy(二)——数据类型

import numpy as np

“数据类型,即dtype,是一个特殊的对象,它包含了ndarray需要为某一个类型数据所申明的内存块信息”——《利用Python进行数据分析 第二版》P92

一个ndarray在被创建时,可以显式地指定其数据类型,而指定的方式不一而同,一般来说,有以下几种:

  • 通过数据类型的字符串指定

arr_float16 = np.array([1,2,3],dtype="float16") #指定数据类型后,不管输入的原列表的数据类型是什么,都会按照指定的类型进行输出
arr_float16
array([ 1.,  2.,  3.], dtype=float16)
arr_int8 = np.array([1,2,3],dtype="int8")
arr_int8
array([1, 2, 3], dtype=int8)
arr_bool = np.array([True,False,True,False],dtype="bool")
arr_bool
array([ True, False,  True, False], dtype=bool)
  • 通过数据类型字符串指定过于繁琐,因此也可以通过类型代码字符串进行指定

arr_f2 = np.array([1,2,3],dtype="f2") #与上述arr_float16完全等价
arr_f2
array([ 1.,  2.,  3.], dtype=float16)
arr_i1 = np.array([1,2,3],dtype="i1")
arr_i1
array([1, 2, 3], dtype=int8)
arr_bool = np.array([True,False,True,False],dtype="?")
arr_bool
array([ True, False,  True, False], dtype=bool)
  • 通过np对象指定

arr_int16 = np.array([1,2,3],dtype=np.int16)
arr_int16
array([1, 2, 3], dtype=int16)
arr_float32 = np.array([1,2,3],dtype=np.float32)
arr_float32
array([ 1.,  2.,  3.], dtype=float32)
  • 通过Python原生数据类型指定

arr_int = np.array([1,2,3],dtype=int)
arr_int
array([1, 2, 3])
arr_float = np.array([1,2,3],dtype=float)
arr_float
array([ 1.,  2.,  3.])

不过,在这种情况下,你无法指定数据类型在内存中的所占字节多少,默认int为32位,float为64位

print(arr_int.dtype)
print(arr_float.dtype)
int32
float64

numpy中所有可用的数据类型见《利用Python进行数据分析 第二版》P93页表4-2,以及《Python数据科学手册》P35表2-1

需要注意的地方:

  • 一般情况下,不必过于思考应该采用哪种字节长度的数据类型,“通常你只需要关系数据的大类,比如是否是浮点型、整数、布尔值、字符串或某个Python对象”(《利用Python进行数据分析 第二版》P92)。当只有在操作危及到你的内存容量的大数据集时,你才需要精打细算,仔细考虑究竟应该采用哪种数据类型,以节约内存,提高数据处理的效率。

关于string_和unicode_数据类型

这两个类型都指向字符或字符串数据类型,但是二者仍与区别,以及有一些值得注意的地方:

  • string_类型的类型代码是S,面向的数据类型是ascii字符串,例如生成一个长度10以内的ascii类型字符串,可以用"S10"

arr_str = np.array(["hello","world","how","are","you","today"],dtype = "S10")
arr_str
array([b'hello', b'world', b'how', b'are', b'you', b'today'],
      dtype='|S10')

可以看到,如果指定的长度小于输入中的某些字符串长度,则输出会按照指定长度进行截取。
并且也可以发现,由于string_是代表ascii类型字符串,因此,得到的输出结果是bytes类型的字符对象,也就是用十进制ascii值表示的二进制字符数据。需要decode解码之后才可以变为str类型的字符串。

arr_str_3 = np.array(["hello","world","how","are","you","today"],dtype = "S3")
arr_str_3
array([b'hel', b'wor', b'how', b'are', b'you', b'tod'],
      dtype='|S3')
arr_str[1][0] #"w"的ascii值是119
119
arr_str[1].decode()
'world'

并且,当我们输入非ascii字符的时候,就会因此错误

arr_str_test = np.array(["hello","你好"],dtype="S10")
arr_str_test
---------------------------------------------------------------------------

UnicodeEncodeError                        Traceback (most recent call last)

<ipython-input-58-f3344d50f40e> in <module>
----> 1 arr_str_test = np.array(["hello","你好"],dtype="S10")
      2 arr_str_test


UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
  • unicode_类型的类型代码是U,面向的数据类型是unicode字符串,例如生成一个长度10以内的unicode类型字符串,可以用"U10"

unicode_类型返回的直接就是str类型字符串。至于该类型其余性状,与string基本一致,不再赘述

arr_unicode = np.array(["hello","你好"],dtype="U10")
arr_unicode
array(['hello', '你好'],
      dtype='<U10')

数据类型转换——astype方法

当一个数组生成后,数据类型也随之被确定,但是仍可用astype方法对其数据类型进行转换,这个方法可以生成一个新的数组

arr1 = np.array([1,2,3]) #如果不指定,那么就是int32
arr1.dtype
dtype('int32')
arr2 = arr1.astype("float64")
arr2.dtype
dtype('float64')

关于astype的注意点:如果想把一个浮点类型数组转成整形,则会丢失小数点后的部分,如9.9转型后将会成为9,-2.7会变成-2。更多细节详见《利用Python进行数据分析 第二版》P93

在最后,仍有一点需要注意:与Python列表不同,numpy数组中的元素数据类型必须相同,如有不同,则自动向上转型:

arr_test = np.array([1,1.5,2,"你好"])
arr_test
array(['1', '1.5', '2', '你好'],
      dtype='<U32')
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
练习使用python-numpy的方法——东北大学大数据班数据挖掘Python基础(1) 实训项目:练习使用numpy的方法。 (1)用0~19的数字生成(4,5)的数组命名为a,查看a的维度;查看a的轴的个数;查看a元素的总个数; (2)创建元素为1,2,3,4的(2,2)的数组 b,查看b中元素类型。 (3)创建一个全1的(4,4)的数组c;创建一个内容随机的(3,2)数组d,并打印d。 (4)用0~11的数,创建一个3*4的数组n1,计算每一列的和;计算每一行的最小值。 (5)生成一个3个元素的数组n2,通过常用函数计算每个元素的平方根;每个元素的标准差。 (6)生成一个9个(可以从0~8)元素的数组n3,计算每个元素的平方根;取出位置2的元素;取出位置2至5之间的元素。 (7)随机生成2个3*3的数组n4和n5,将n4和n5进行垂直合并形成n6;将n4和n5进行水平合并形成n7。 (8)创建一个2行3列的零矩阵命名为z,将z的2行3列的位置值置成1。 (9)生成4*4的对角矩阵,以[1,2,3,4]为对角线,其他位置用0填充,命名为z1 。 (10)用0~8的数,创建成`3*3`的矩阵,命名为z2;用随机数,创建`4*4`的矩阵,命名为z3。 (11)读取iris数据集中的数据。 (12)获取数据中的花萼长度数据。 (13)对花萼长度数据进行排序。 (14)对花萼长度数据进行去重。 (15)对花萼长度数据进行求和。 (16)对花萼长度数据进行求均值。 (17)对花萼长度数据求累计和。 (18)对花萼长度数据求标准差。 (19)对花萼长度数据求方差 。 (20)对花萼长度数据求最大值、最小值。
数据分析 数据分析——数据校验 数据校验   很多时候在数据分析之前,我们需要对样本进⾏校验,以确定样本的价值。   先写⼊数据: import pandas as pd import numpy as np df = pd.DataFrame({'⼀班':[90,80,66,75,99,55,76,78,98,None,90], '⼆班':[75,98,100,None,77,45,None,66,56,80,57], '三班':[45,89,77,67,65,100,None,75,64,88,99]}) 1完整性校验 完整性校验 # 判断是否为缺失值(空值) df.isnull() # 统计出每⼀列的缺失值数⽬ df.isnull().sum() # 每⼀列缺失⽐例 df.isnull().sum()/df.shape[0] # 判断⾮空值的数⽬ df.notnull().sum()   笔记:这⾥也可以⽤到describe⽅法,如下: # 使⽤describe⽅法查看数据的完整性,统计出了⾮空值的数⽬ df.describe().iloc[0,:]   忘了describe⽅法的话,请查看《》 2时间跨度检验 时间跨度检验   很多样本的时间数据并不是以datatime64类型存储的,此时我们得先进⾏"数据类型修改"   详见:《》的4.3数据修改   之后进⾏最⼤最⼩相减就OK了。 print(date.max()-date.min()) 3重复检验 重复检验 # ⼆班和四班是相同的 df1 = pd.DataFrame({'⼀班':[90,80,66,90,99,55,76,90,98,None,90], '⼆班':[75,98,100,75,77,45,None,75,56,80,57], '三班':[45,89,77,45,65,100,None,45,64,88,99], '四班':[75,98,100,75,77,45,None,75,56,80,57]}) 3.1样本重复检验(⾏) 样本重复检验(⾏) DataFrame.drop_duplicates(subset=None, keep='first', inplace=False) subset:表⽰以这⼏个特征为基础,对整体样本进⾏去重。默认为使⽤所有特征 keep:表⽰保留第⼏个重复的样本。只允许填⼊first(保留第⼀个),last(保留最后⼀个),False(只要存在重复均不保留)。默认为first inplace:表⽰是否在原DataFrame上进⾏操作,会改变原数据。默认为False # 删除重复样本(⾏) df1.drop_duplicates() # 计算样本重复率 (df1.shape[0] - df1.drop_duplicates().shape[0])/df1.shape[0] 3.2特征重复检验(列) 特征重复检验(列)   特征重复检验相⽐样本重复检验要⿇烦⼀点,因为没有现成的函数可调⽤。   需要⽤到相似度的概念,如下: pearson相似度 spearman相似度 kendall相似度 # 使⽤pandas的⽅法:DataFrame.corr(method='pearson') asso = df1.corr() # 输出asso,看⼀下是怎样的先 print(asso)   不难看出,这是⼀个对称矩阵,所以我们只需要判断右上半⾓的数据便可。 # 输出应删除的columns,1.0可根据需求改动 delCol = [] for i in range(len(asso)): for j in range(i+1,len(asso)): if asso.iloc[i,j] == 1.0: delCol.append(asso.columns[j]) print(delCol) 最后,附上⼀段 特征重复检验 的⾃定义代码: # 输⼊DataFrame,输出特征重复的列名,可直接复制调⽤ def drop_features(data,way = 'pearson',assoRate = 1.0): ''' 此函数⽤于求取相似度⼤于assoRate的两列中的⼀个,主要⽬的⽤于去除数值型特征的重复 data:数据框,⽆默认 assoRate:相似度,默认为1 ''' assoMat = data.corr(method = way) delCol = [] length = len(assoMat) for i in range(length): for j in range(i+1,length): if asso.iloc[i,j] >= assoRate: delCol.append(assoMat.columns[j]) r
回答: 在NumPy中,dtype是用来描述数组中元素类型的对象。它可以用来指定数组中元素的数据类型,例如整数、浮点数、字符串等。\[1\]在Python中,可以使用type()函数来获取一个对象的类型,而使用dtype属性来获取NumPy数组的数据类型。\[1\]当使用Pandas数据转换为NumPy数组时,有时会出现ValueError: Pandas data cast to numpy dtype of object的错误。解决方法是使用np.asarray(data)来检查输入数据。\[2\]在NumPy中,还可以使用数据类型对象和结构化数组来定义复杂的数据类型数据类型对象可以指定每个字段的名称、数据类型和形状。结构化数组是一种特殊的NumPy数组,它的每个元素都可以包含多个字段。\[3\] #### 引用[.reference_title] - *1* *3* [Python 教程之 Numpy(4)—— 数据类型对象](https://blog.csdn.net/m0_73720982/article/details/127052592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [解决statsmodels报错ValueError: Pandas data cast to numpy dtype of object.](https://blog.csdn.net/weixin_35757704/article/details/120951789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值