NumPy 的ndarray:一种多维数组对象

该对象是一个快速且灵活的大数据容器,可以利用这种数组对整个数据进行科学计算,语法跟标量元素之间的计算一样。

创建ndarray的方法:

array函数:它接受一些序列型的对象,然后产生一个含有传入数据的numpy数组。

 import numpy as np

 data1 = [1,3,6.5,3]
data2 = [[1,3,5,7,9],[2,4,6,8,10]]
np_data = np.array(data1)
np_data2 = np.array(data2)
print("维度",np_data.ndim)
print("数据类型",np_data.dtype)
print("各维度大小",np_data.shape)
print("array1",np_data)
print("array2",np_data2)
print("维度",np_data2.ndim)
print("数据类型",np_data2.dtype)
print("各维度大小",np_data2.shape) #####
维度 1
数据类型 float64
各维度大小 (4,)
array1 [1. 3. 6.5 3. ]
array2 [[ 1 3 5 7 9]
[ 2 4 6 8 10]]
维度 2
数据类型 int32
各维度大小 (2, 5)

zeros ,ones 可以创指定维度和形状的全0或全1 的数组。empty可以创建没有具体任何数组的数组。

 np_data = np.zeros(10)
np_data2 = np.ones((3,4)) print("array1",np_data)
print("维度",np_data.ndim)
print("数据类型",np_data.dtype)
print("各维度大小",np_data.shape) print("array2",np_data2)
print("维度",np_data2.ndim)
print("数据类型",np_data2.dtype)
print("各维度大小",np_data2.shape) ####print#### array1 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
维度 1
数据类型 float64
各维度大小 (10,)
array2 [[1. 1. 1. 1.]
[1. 1. 1. 1.]
[1. 1. 1. 1.]]
维度 2
数据类型 float64
各维度大小 (3, 4)
 np_data3 = np.empty((2,3,2))
print("array3",np_data3)
print("维度",np_data3.ndim)
print("数据类型",np_data3.dtype)
print("各维度大小",np_data3.shape) array3 [[[8.82769181e+025 7.36662981e+228]
[7.54894003e+252 2.95479883e+137]
[1.42800637e+248 2.64686750e+180]] [[1.09936856e+248 6.99481925e+228]
[7.54894003e+252 7.67109635e+170]
[2.64686750e+180 5.63234836e-322]]]
维度 3
数据类型 float64
各维度大小 (2, 3, 2)

empty产生的是未初始化的垃圾数值

arange是python内置函数range的数组版本

In [1]: import numpy as np

In [2]: np.arange(10)
Out[2]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

eye和identity 创建一个正方形的N*N的单位矩阵

 In [3]: np.eye(3)
Out[3]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]]) In [5]: np.identity(3)
Out[5]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])

ndarray 的数据类型:

NumPy的数据类型:

类型 类型说明
int8,uint8 有符号和无符号的8位(1个字节)整型
int16,uint16 有符号和无符号的16位(2个字节)整型
int32,uint32 有符号和无符号的32位(3个字节)整型
int64,uint64 同上类似
float16 半精度浮点数
float32 标准的单精度浮点数
float64  
float128  
complex64,complex128,complexu256 分别用两个32位、64位、128位浮点数表示的复数
bool 布尔类型
object python对象类型
string_ 固定长度的字符串类型(每个字符1个字节)
unicode_ 固定长度的unicode类型(字节数由平台数而定)

可以通过astype进行显示的转换

 In [35]: arr = np.array([1,2,3,4,5])

 In [36]: arr.dtype
Out[36]: dtype('int32') In [37]: folat_arr = arr.astype(np.float64) In [39]: float_arr = arr.astype(np.float64) In [40]: float_arr
Out[40]: array([1., 2., 3., 4., 5.]) In [41]: float_arr.dtype
Out[41]: dtype('float64')

需要注意的是:调用astype始终会创建一个新的数组(原始数据的一份拷贝)

数组和标量之间的运算

数组可以矢量化。大小相等的数组之间的任何运算都是元素级的,数组与标量的运算会传播到各个元素。

 In [42]: arr = np.array([[1,2,3],[4,5,6]])

 In [43]: arr
Out[43]:
array([[1, 2, 3],
[4, 5, 6]]) In [44]: arr*arr
Out[44]:
array([[ 1, 4, 9],
[16, 25, 36]]) In [45]: arr*2
Out[45]:
array([[ 2, 4, 6],
[ 8, 10, 12]])

基本的索引和切片

与python的list的索引和切片类似

但需要注意的是数组切片是原始数组的试图,并不是像list一样是数据的复制。

In [46]: arr = np.arange(10)

In [47]: arr
Out[47]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) In [48]: arr_slice = arr[5:8] In [50]: arr_slice[2] =12 In [51]: arr
Out[51]: array([ 0, 1, 2, 3, 4, 5, 6, 12, 8, 9])

如果要拷贝一份副本而不是试图,需要显式复制 arr.copy()

访问多维数组的元素:arr[0][1]

可以一次传入多个切片

In [52]: arr = np.array([[1,2,3],[4,5,6]])

In [53]: arr[:1,1:]
Out[53]: array([[2, 3]]) In [54]: arr[1,:2]
Out[54]: array([4, 5])

布尔型索引

In [55]: names = np.array(['Bob','Joe','Will','Bob','will'])

In [56]: names
Out[56]: array(['Bob', 'Joe', 'Will', 'Bob', 'will'], dtype='<U4') In [62]: data = np.random.randn(5,4) In [63]: data[names=='Bob'] #names = 'Bob'产生一个布尔类型数组,这个数组可以作为索引使用,这个数组的长度,必须跟被索引的数组的轴长度一致
Out[63]:
array([[-1.79012449, -0.01804037, 0.43492455, -1.35150168],
[ 0.75883679, -0.34051626, 0.10205794, 0.39826656]])

要选取除‘Bob’以外的值,可以使用不等号 !=

In [64]: data[names!='Bob']
Out[64]:
array([[ 0.73624561, -0.2467165 , 0.72230317, 0.50554012],
[ 0.39531108, 0.89543353, 0.30720349, -1.1979887 ],
[-0.57461644, 0.66571736, 0.50462228, 0.10375058]])

选取多个条件,可以进行与或运算(& ,|)

In [67]: data[(names =='Bob')| (names =="Will")]
Out[67]:
array([[-1.79012449, -0.01804037, 0.43492455, -1.35150168],
[ 0.39531108, 0.89543353, 0.30720349, -1.1979887 ],
[ 0.75883679, -0.34051626, 0.10205794, 0.39826656]])

花式索引:它是指利用整数的数组进行索引。

arr =np.empty((8,4))

In [70]: for i in range(8):
...: arr[i] = i+10
...: In [71]: arr
Out[71]:
array([[10., 10., 10., 10.],
[11., 11., 11., 11.],
[12., 12., 12., 12.],
[13., 13., 13., 13.],
[14., 14., 14., 14.],
[15., 15., 15., 15.],
[16., 16., 16., 16.],
[17., 17., 17., 17.]]) #通过花式索引取值
In [72]: arr[[4,3,0,6]]
Out[72]:
array([[14., 14., 14., 14.],
[13., 13., 13., 13.],
[10., 10., 10., 10.],
[16., 16., 16., 16.]])
#通过负数索引从后向前取值

In [73]: arr[[-4,-3,-6]]
Out[73]:
array([[14., 14., 14., 14.],
[15., 15., 15., 15.],
[12., 12., 12., 12.]])

数组转置和轴交换:

T属性:

T属性相当于求转置矩阵

  

 In [74]: arr = np.arange(15).reshape(3,5)

 In [75]: arr
Out[75]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]]) In [76]: arr.T
Out[76]:
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])

transpose 方法:根据轴的索引进行转置,举例说明:arr_T中数值5 的索引元祖是(0,1,3),tanspose(1,0,2)相当于根据索引重新定义索引元祖为(1,0,3)

 In [78]: arr_t = np.arange(16).reshape(2,2,4)

 In [79]: arr_t
Out[79]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]], [[ 8, 9, 10, 11],
[12, 13, 14, 15]]]) In [80]: arr_t.transpose(1,0,2)
Out[80]:
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]], [[ 4, 5, 6, 7],
[12, 13, 14, 15]]])

swapaxes方法

In [81]: name = ['John','David','Rose','Jack']

In [82]: age = [12,23,44,22]

In [88]: person = [name,age]

In [89]: person =np.array(person)

In [90]: person
Out[90]:
array([['John', 'David', 'Rose', 'Jack'],
['', '', '', '']], dtype='<U5') In [91]: person.swapaxes(0,1)
Out[91]:
array([['John', ''],
['David', ''],
['Rose', ''],
['Jack', '']], dtype='<U5') In [92]:

NumPy基础知识:数组和矢量计算的更多相关文章

  1. 《利用Python进行数据分析·第2版》第四章 Numpy基础:数组和矢量计算

    <利用Python进行数据分析·第2版>第四章 Numpy基础:数组和矢量计算 numpy高效处理大数组的数据原因: numpy是在一个连续的内存块中存储数据,独立于其他python内置对 ...

  2. 《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算

    http://www.cnblogs.com/batteryhp/p/5000104.html 第四章 Numpy基础:数组和矢量计算 第一部分:numpy的ndarray:一种多维数组对象 实话说, ...

  3. 利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

  4. 【学习笔记】 第04章 NumPy基础:数组和矢量计算

    前言 正式开始学习Numpy,参考用书是<用Python进行数据清洗>,计划本周五之前把本书读完,关键代码全部实现一遍 NumPy基础:数组和矢量计算 按照书中所示,要搞明白具体的性能差距 ...

  5. python数据分析---第04章 NumPy基础:数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  6. 《利用python进行数据分析》NumPy基础:数组和矢量计算 学习笔记

    一.有关NumPy (一)官方解释 NumPy is the fundamental package for scientific computing with Python. It contains ...

  7. (一)NumPy基础:数组和矢量计算

    一.创建ndarray 1.各种创建函数的使用 import numpy as np #创建ndarray #1.array方法 data1 = [[6, 7.5, 8, 0, 1], [2, 8, ...

  8. NumPy基础:数组和矢量计算

    今天被老板fire了,还是继续抄书吧,安抚我受伤的小心脏.知识还是得慢慢积累,一步一个脚印,这样或许才是最快的捷径. ------2015-2-16-------------------------- ...

  9. 《利用Python进行数据分析》笔记---第4章NumPy基础:数组和矢量计算

    写在前面的话: 实例中的所有数据都是在GitHub上下载的,打包下载即可. 地址是:http://github.com/pydata/pydata-book 还有一定要说明的: 我使用的是Python ...

  10. Python之NumPy实践之数组和矢量计算

    Python之NumPy实践之数组和矢量计算 1. NumPy(Numerical Python)是高性能科学技术和数据分析的基础包. 2. NumPy的ndarray:一种对位数组对象.NumPy最 ...

随机推荐

  1. 完美运动框架(js)

    一.前言 学习js运动时,由于在实现多种不同运动效果过程中很多代码是重复的,故将其封装达到代码重用. 二.代码封装重用 function startMove(obj, json, fnEnd){ cl ...

  2. Atitit.code base view 视图的实现原理

    Atitit.code base view 视图的实现原理 1. 视图的执行算法:1 2. 不可更新的视图:1 3. 关于视图的可插入性:insert2 4. 视图定义3 5. 调用3 1. 视图的执 ...

  3. MII、GMII、RMII、SGMII、XGMII

    MII即媒体独立接口,也叫介质无关接口.它是IEEE-802.3定义的以太网行业标准.它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1). 数据接口包括分别用于发送器和接收器的两条独立信 ...

  4. random实现验证码功能

    直接上代码: #-*- coding: utf-8 -*- #一个简单的验证码程序 import random #定义一个全局变量,初始值为空字符串 checkcode = '' for i in r ...

  5. java & c sharp 的关联

    第一.java是真正的与平台无关,c sharp不是,他只是口头上的与平台无关,最后,却要靠别人来实现非微软平台的类库. 第二.java中的类名.class 和c#的 typeof(类名)或者getT ...

  6. UIView 实例方法 Instance Methods(转)

    好了,我接着上篇,开始我们的对UIView 实例方法的探索 UIView 实例方法 Instance Methods 初始化一个视图 - (id)initWithFrame:(CGRect)aRect ...

  7. input子系统分析(转)

    转自:http://www.linuxidc.com/Linux/2011-09/43187.htm 作者:作者:YAOZHENGUO2006 Input子系统处理输入事务,任何输入设备的驱动程序都可 ...

  8. hdu5673 Robot 卡特兰数+组合数学+线性筛逆元

    Robot Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  9. Mysql 变量讲解

    set语句的学习: 使用select定义用户变量的实践将如下语句改成select的形式: set @VAR=(select sum(amount) from penalties);我的修改: sele ...

  10. 关于swift 单元测试的补充

    最近小弟在自己学习研究swift , 习惯于写一边写单元测试一边写逻辑的我来说,在xcode环境没有单元测试,写起来就是有个不是实在的感觉. 至于怎么创建单元测试.怎么写,不是这个文章的主题,因为看了 ...