NumPy学习笔记:3、更加复杂的数组

一、更多的数据类型

1、Casting

(1) 在混合数据类型的运算中,最终运算结果的数据类型与size更大的数据类型相同。

>>> np.array([1, 2, 3]) + 1.5
array([ 2.5,  3.5,  4.5])

(2) 给数组中的元素赋值,并不能改变整个数组的数据类型。(若把整型数组中的某个元素赋值为浮点型数据,则这个浮点型数据会被截断为整型)

>>> a = np.array([1, 2, 3])
>>> a.dtype
dtype(‘int64‘)
>>> a[0] = 1.9     # <-- float is truncated to integer
>>> a
array([1, 2, 3])

(3) 强制类型转换

>>> a = np.array([1.7, 1.2, 1.6])
>>> b = a.astype(int)  # <-- truncates to integer
>>> b
array([1, 1, 1])

(4) 四舍五入,但并不改变数组的数据类型

>>> a = np.array([1.2, 1.5, 1.6, 2.5, 3.5, 4.5])
>>> b = np.around(a)
>>> b                    # still floating-point
array([ 1.,  2.,  2.,  2.,  4.,  4.])
>>> c = np.around(a).astype(int)
>>> c
array([1, 2, 2, 2, 4, 4])

2、Different data type sizes - 不同数据类型的大小

有符号整型 int8 8 bits
int16 16 bits
int32 32 bits(32位平台上 int 型默认大小)
int64 64 bits(64位平台上 int 型默认大小)
无符号整型 uint8 8 bits
uint16 16 bits
uint32 32 bits
uint64 64 bits
浮点型 float16 16 bits
float32 32 bits
float64 64 bits(float 默认大小)
float96 96 bits, platform-dependent(与 np.longdouble 相同)
float128 128 bits, platform-dependent(与 np.longdouble 相同)
复数浮点型 complex64 two 32-bit floats
complex128 two 64-bit floats
complex192 two 96-bit floats, platform-dependent
complex256 two 128-bit floats, platform-dependent

二、结构化数据类型

sensor_code (4-character string)
position (float)
value (float)
>>> samples = np.zeros((6,), dtype=[(‘sensor_code‘, ‘S4‘),
...                                 (‘position‘, float), (‘value‘, float)])
>>> samples.ndim
1
>>> samples.shape
(6,)
>>> samples.dtype.names
(‘sensor_code‘, ‘position‘, ‘value‘)

>>> samples[:] = [(‘ALFA‘,   1, 0.37), (‘BETA‘, 1, 0.11), (‘TAU‘, 1,   0.13),
...               (‘ALFA‘, 1.5, 0.37), (‘ALFA‘, 3, 0.11), (‘TAU‘, 1.2, 0.13)]
>>> samples
array([(‘ALFA‘, 1.0, 0.37), (‘BETA‘, 1.0, 0.11), (‘TAU‘, 1.0, 0.13),
       (‘ALFA‘, 1.5, 0.37), (‘ALFA‘, 3.0, 0.11), (‘TAU‘, 1.2, 0.13)],
      dtype=[(‘sensor_code‘, ‘S4‘), (‘position‘, ‘<f8‘), (‘value‘, ‘<f8‘)])

# 使用列名进行索引
>>> samples[‘sensor_code‘]
array([‘ALFA‘, ‘BETA‘, ‘TAU‘, ‘ALFA‘, ‘ALFA‘, ‘TAU‘],
      dtype=‘|S4‘)
>>> samples[‘value‘]
array([ 0.37,  0.11,  0.13,  0.37,  0.11,  0.13])
>>> samples[0]
(‘ALFA‘, 1.0, 0.37)

>>> samples[0][‘sensor_code‘] = ‘TAU‘
>>> samples[0]
(‘TAU‘, 1.0, 0.37)

# 同时获取多列
>>> samples[[‘position‘, ‘value‘]]
array([(1.0, 0.37), (1.0, 0.11), (1.0, 0.13), (1.5, 0.37), (3.0, 0.11),
       (1.2, 0.13)],
      dtype=[(‘position‘, ‘<f8‘), (‘value‘, ‘<f8‘)])

# 花式索引同样适用
>>> samples[samples[‘sensor_code‘] == ‘ALFA‘]
array([(‘ALFA‘, 1.5, 0.37), (‘ALFA‘, 3.0, 0.11)],
      dtype=[(‘sensor_code‘, ‘S4‘), (‘position‘, ‘<f8‘), (‘value‘, ‘<f8‘)])

更多信息请参考:https://docs.scipy.org/doc/numpy/user/basics.rec.html

https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html#specifying-and-constructing-data-types

三、maskedarray: dealing with (propagation of) missing data - 蒙面数组:缺失值的处理

对于浮点型数据来说,我们可以使用NaN来处理缺失值,但是面具可以处理任何类型的数据的缺失值。

>>> x = np.ma.array([1, 2, 3, 4], mask=[0, 1, 0, 1])
>>> x
masked_array(data = [1 -- 3 --],
             mask = [False  True False  True],
       fill_value = 999999)

>>> y = np.ma.array([1, 2, 3, 4], mask=[0, 1, 1, 1])   # 0代表False,表示没有面具,也就是不会被当作不可用的数据
>>> y
masked_array(data = [1 -- -- --],
             mask = [False  True  True  True],
       fill_value = 999999)

>>> x + y
masked_array(data = [2 -- -- --],
             mask = [False  True  True  True],
       fill_value = 999999)
时间: 2024-11-03 05:43:46

NumPy学习笔记:3、更加复杂的数组的相关文章

Numpy学习笔记(二)

最近一直在学HTML5和CSS3,Numpy的东西都有些生疏,那本书是已经看完了的,紧跟着相关的代码也都敲了一遍,还是发现了一些问题,因为这样的学习方式,总感觉太被动,紧紧跟着示例代码,缺少了整体观,即使你现在问我Numpy可以处理什么问题,我还是回答不出.所以,有必要回头重来一遍,再一次审视代码背后的意义,写博客真的是一个很不错的方式,毕竟,如果你不懂,写出来的文字必然也是混乱的. 那,下面记录一下Numpy学习笔记(二) Example1 文件读写:数据不应该仅仅存在内存里,应该及时保存在硬

算法学习笔记 KMP算法之 next 数组详解

最近回顾了下字符串匹配 KMP 算法,相对于朴素匹配算法,KMP算法核心改进就在于:待匹配串指针 i 不发生回溯,模式串指针 j 跳转到 next[j],即变为了 j = next[j]. 由此时间复杂度由朴素匹配的 O(m*n) 降到了 O(m+n), 其中模式串长度 m, 待匹配文本串长 n. 其中,比较难理解的地方就是 next 数组的求法.next 数组的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀,也可看作有限状态自动机的状态,而且从自动机的角度反而更容易推导一些. "前

《Javascript权威指南》学习笔记之十二:数组、多维数组和符合数组(哈希映射)

Array(数组)是JavaScript中较为复杂的数据类型,同Java.C#.VB等程序语言的数组相比,Javascript数组中的元素不必为相同的数据类型,可以在数组每个元素上混合使用数字.日期.字符串.Object,甚至添加一个嵌套数组. 一.创建数组 1.var arr1 = new Array(); /var  arr2 = new Array(length); /var arr3 = new Array(element1,element2...); var arr4 = [eleme

NumPy学习笔记 一

NumPy学习笔记 一 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分析>第四版(华东师范大学数学系).<概率论与数理统计>(陈希孺,中科大出版).<概率论与数理统计>第二版(茆诗松.程依明等编).<组合最优化:理论与方法>(现代数学译丛23).笔记一主要记录NumPy&SciPy及相关软件的环境准备部分. NumPy的官方网站

NumPy学习笔记 三 股票价格

NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分析>第四版(华东师范大学数学系).<概率论与数理统计>(陈希孺,中科大出版).<概率论与数理统计>第二版(茆诗松.程依明等编).<组合最优化:理论与方法>(现代数学译丛23).笔记三主要操作股票价格数据. 股票价格数据通常包括开盘价.最高价.最低价和收盘价.

Numpy学习笔记(一)

Python本身支持的数据结构不多,除了int.float和string等一些常规的之外,还有列表.元祖.字典,都有自己的属性和方法,怎么说呢,功能已经足够强大,解决一般的问题已经足够,可当数据量增大,计算形式变得多样,这种普通的数据结构效率不高,况且python本身对于数组的支持不是很好,这也是为什么会有一批类似于numpy.scipy.panda等第三方库,大大扩展了python的功能,胶水的本质越来越突出.学习的成本也不高,不会像重新学一门语言那么困难,况且据了解,python的科学计算能

Python numpy学习笔记(一)

下边代码是关于numpy的一些基本用法,包括数组和矩阵操作等... 1 import numpy as np 2 print "<== print version ==>" 3 print np.version.version 4 print "<== 1-dimensional array ==>" 5 print np.array([1, 2, 3, 4, 5]) 6 print "<== 2-dimentional ar

NumPy学习笔记(1)

1. 程序开头导入库 import numpy as np 2. 创建数组(ndarray) a = [1,2,3,4] aa = np.array(a)--------->生成一维数组 bb = np.array([a,a])----->生成二维数组 aa.shape bb.shape------------------>获得尺寸(2, 4) bb.shape = (1,8) ---------> Reshape为1X8数组,8可以用-1表示,这样自动计算尺寸 c = bb.re

Numpy 学习之路(1)——数组的创建

数组是Numpy操作的主要对象,也是python数据分析的主要对象,本系列文章是本人在学习Numpy中的笔记. 文章中以下都基于以下方式的numpy导入: import numpy as np from numpy import * 1.普通数组的创建——np.arange(), np.array(), (1) arange()建立是顺序数组,函数原型:arange([start,]stop[,step],dtype=None) 其中start参数如果省略,则表示从0开始,默认的dtype为fl