ndarray笔记
Numpy的介绍
1. Ndarray:N-dimensional array, N维数组
2. 一种由相同类型的元素组成的多维数组,元素数量是事先指定好的
例:建立Ndarray多维数组 ndarray父类实现矩阵的创建基本方式:
arr = np.array(
[
[1,2,3,4],
[2,3,4,5]
])
这是一个二维数组arr.ndim为2 这个数组的形状arr.shape为(2, 4)即2行4列
这个数组的元素个数np.size为8个,这个数组的数据类型arr.dtype为int32
shape属性-->几行几列
ndim属性-->几维度 向量-->1维度 矩阵-->二维度 数组-->3维度
size属性-->数组元素的个数
dtype-->元素类型
# 矩阵的定义
import numpy as np
b = np.array([[1,2,3,4], [2,3,4,5]])
print(b)
print(type(b)) # 矩阵的性质几行几列
print('shape',b.shape) # (2,4)
# 几维度 向量-->1维度 矩阵-->二维度 数组-->3维度
print(b.ndim) #
# 元素类型
print(b.dtype) # int32
# 数组元素的个数
print(b.size) # 8 => 2*4
3. 元素的数据类型由dtype(data-type)对象来指定,每个ndarray只有一种dtype类型
例:
np.array(['Python','cctv','ibeifeng','hello world'],dtype='|S4')
输出结果array([b'Pyth', b'cctv', b'ibei', b'hell'], dtype='|S4')
其中S4中的S表示字符串型,4表示每个字符串长度为4,所以输出结果每个数组只有4个字符
arr3 = np.array(['1','2','3','4'],dtype='int') # 表明arr3为整型
# 输出array([1, 2, 3, 4])
arr3 = np.array(['1','2','3','4'],dtype='float') # 表明arr3为浮点型
# 输出array([1., 2., 3., 4.])
4. 大小固定,创建好数组时一旦指定好大小,就不会再发生改变
数组的形状可以方便的读取数字例如
arr1 = np.array([[[ 1, 2, 3, 4, 5],
[ 2, 3, 4, 5, 6],
[ 3, 7, 4, 5, 6],
[ 3, 1, 4, 6, 7]],
[[11, 2, 23, 54, 5],
[28, 32, 42, 53, 46],
[35, 27, 74, 55, 86],
[63, 61, 44, 64, 87]]])
这个数组的形状为(2,4,5)可以通过arr1[0][1][1]这个形式取到3
ndarray的常见创建方式
- array函数:接收一个普通的Python序列,转成ndarray
- zeros函数:创建指定长度或形状的全零数组
np.zeros((3,4)) 创建3行4列全为0的数组,且默认为float型
3. ones函数:创建指定长度或形状的全1数组
np.ones((3,4),dtype=int) 创建3行4列全为1的整形数组,如果没有dtype=int,默认为float型
4. empty函数:创建一个没有任何具体值的数组(准确地说是一些未初始化的垃圾值)
np.empty((7,4)) 创建7行4列随机值数组,float型
ndarray的其他创建方式
1.arrange函数:类似与python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值
np.arange(2,20,3)
# 输出 array([ 2, 5, 8, 11, 14, 17])
2. linspace函数:通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值,它创建的是等差数列
np.linspace(2,20,3) 包含20
# 输出 array([ 2., 11., 20.])
3.logspace函数:和linspace类似,但它创建的是等比数列
np.logspace(2,20,3)
# 输出 array([1.e+02, 1.e+11, 1.e+20])
4.使用随机数填充数组,即使用numpy.random模块的random()函数,数组所包含的元素数量由参数决定
np.random.random((2,3,4))
# 输出 array([[[0.40595225, 0.80061568, 0.16821289, 0.05557114],
[0.96146758, 0.81135374, 0.93132755, 0.11023897],
[0.79526355, 0.61563423, 0.78924163, 0.21849418]],
[[0.36029206, 0.883596 , 0.60343721, 0.38746385],
[0.92802328, 0.91256992, 0.61305594, 0.86444498],
[0.6619579 , 0.55846171, 0.37563522, 0.35721423]]])
np.random.random_sample()生成一位随机数
ndarry的shape属性巧算
np.arange(2,20,2).reshape((3,-1)) # -1 则会自动计算维度
# 输出 array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
总结:
- 先规范显示出数组
- 层层去中括号对,直到无中括号对,每去一层,一个维度,去掉一层[],后的元素个数(逗号隔开)即该维度的元素个数
NumPy中的数据类型
1. 创建NumPy数组时可以通过dtype属性显示指定数据类型,如果不指定,NumPy会自己推断出合适的数据类型,所以一般无需显示指定
arr2=np.arange(2,10,2),无需指定可判断为int32型
2. astype方法,可以转换数组的元素数据类型,得到一个新数组
arr3 = arr2.astype('float') # 为float64型
# 输出array([2., 4., 6., 8.])
arr4 = arr2.astype('|U2') # 使用unicode编码,每个元素长度为2
# 输出array(['2', '4', '6', '8'], dtype='<U2')
3.数值型dtype的命名方式:一个类型名(比如int、float),后面接着一个用于表示各元素位长的数字
比如表中的双精度浮点值,即Python中的float对象,需要占用8个字节(即64位),因此该类型在NumPy中就记为float64
4.每种类型有一个相对应的类型代码,即简写方式,参照下面的表
改变ndarray的形状
1. 直接修改ndarray的shape值
2. 使用reshape函数,可以创建一个改变了尺寸的新数组,原数组的shape保持不变,但注意他们共享内存空间,
因此修改任何一个也对另一个产生影响,因此注意新数组的元素个数必须与原数组一样
arr=np.arange(20)
arr.reshape((4,5))
# 输出array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
reshape函数不会改变原来的ndarray,但是得到的新的ndarray是原数组的视图
视图
多个变量使用(指向)一个内存地址(空间)
对于ndarray的一些方法操作,首先区分是否会改变原变量,以此来判断是视图还是副本
副本
把原来的内容,重新复制(拷贝)了一份新的数据,放到新的内存地址(空间)
即使修改了其中一个变量的元素值,并不会影响另外一个变量
3. 当指定新数组某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度
arr2=arr.reshape((2,-1))
# array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
NumPy基本操作
- 数组与标量、数组之间的运算
- 数组的矩阵积(matrix product)
- 数组的索引与切片
- 数组转置与轴对换
- 通用函数:快速的元素级数组函数
- 聚合函数
- np.where函数
- np.unique函数
数组与标量、数组之间的运算
- 数组不用循环即可对每个元素执行批量运算,这通常就叫做矢量化,即用数组表达式代替循环的做法
- 矢量化数组运算性能要比纯Python方式快上一两个数量级
- 大小相等的数组之间的任何算数运算都会将运算应用到元素级
元素级运算
- 像上面例子展现出来的,加、减、乘、除、幂运算等,可以用于数组与标量、大小相等数组之间
- 在NumPy中,大小相等的数组之间运算,为元素级运算,即只用于位置相同的元素之间,所得到的运算结果组成一个新的数组,运算结果的位置跟操作数位置相同
arr1=np.random.random((2,3))
arr2=np.arange(1,7).reshape(2,3) #arr2必须转换为2行3列才能和arr1进行加、减、
乘、除、幂运算
数组的矩阵积(matrix product)
1. 两个二维矩阵(多维数组即矩阵)满足第一个矩阵的列数与第二个矩阵的行数相同,那么可以进行矩阵乘法,即矩阵积不是元素级的运算
因为矩阵积是第一个矩阵的行与第二个矩阵的列相乘
f
a,b,c . g = a*f+b*g+c*h
(行) h
(列)
注意:矩阵积:第一个矩阵的列轴(水平的轴)要等于第二个矩阵的行轴(垂直的轴)
- 两个矩阵相乘结果所得到的数组中每个元素为,第一个矩阵中与该元素行号相同的元素与第二个矩阵中与该元素列号相同的元素,两两相乘后求和
ndarray笔记的更多相关文章
- ndarray笔记续
数组的索引与切片 多维数组的索引 import numpy as np arr=np.arange(1,25).reshape(2,3,4) arr # 输出 array([[[ 1, 2, 3, 4 ...
- python开发笔记-ndarray方法属性详解
Python中的数组ndarray是什么? 1.NumPy中基本的数据结构 2.所有元素是同一种类型 3.别名是array 4.利于节省内存和提高CPU计算时间 5.有丰富的函数 ndarray的创建 ...
- 读书笔记二、ndarray的数据类型
dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息: import numpy as np arr1=np.array([1,2,3],dtype=np ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引. ndarray 对象是用于存放同类型元素的多维数组. ndarr ...
- NumPy笔记-ndarray
ndarray,N维数组对象(矩阵) 所有元素必须是相同类型 ndim属性,维度个数 shape属性,各维度大小 dtype属性,数据类型 创建ndarray np.array(collection) ...
- Theano 学习笔记(一)
Theano 学习笔记(一) theano 为什么要定义共享变量? 定义共享变量的原因在于GPU的使用,如果不定义共享的话,那么当GPU调用这些变量时,遇到一次就要调用一次,这样就会花费大量时间在数据 ...
- MXNet设计笔记之:深度学习的编程模式比较
市面上流行着各式各样的深度学习库,它们风格各异.那么这些函数库的风格在系统优化和用户体验方面又有哪些优势和缺陷呢?本文旨在于比较它们在编程模式方面的差异,讨论这些模式的基本优劣势,以及我们从中可以学到 ...
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- python数据分析入门学习笔记
学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...
随机推荐
- python3编程基础之一:代码封装
几乎现代的编程语言都支持函数,函数是代码段的封装,并能实现一特定功能,并能重复使用的代码单位.之前的pow()和sqrt()和print()和input()等类似的内置函数,就是python内部已经实 ...
- ubuntu dnsmasq
/var/run/NetworkManager/resolv.conf 而你真实的dns服务器地址,是被这个服务管理维护着的/ local process -> local dnsmasq -& ...
- Java项目开发
项目开发整体构建: MVC+DAO设计模式 用面向对象的方式理解和使用数据库,一个数据库对应一个java项目 数据库--项目 表--类 字段--属性 表中的一条数据--类的一个对象 M:模型层 Jav ...
- Code First 迁移----官方 应用程序启动时自动升级(MigrateDatabaseToLatestVersion 初始值设定项)
Code First 迁移 如果使用的是 Code First 工作流,推荐使用 Code First 迁移改进应用程序的数据库架构. 迁移提供一组允许以下操作的工具: 创建可用于 EF 模型的初始数 ...
- Bitmap: 使用Bitmap作为绘图缓冲时设置抗锯齿
android上绘图时常用的抗锯齿方法是: paint.setAntiAlias(true); 但是在以Bitmap作为绘图缓冲绘制时,绘制出来的Bitmap可能仍然有锯齿,此时可以在绘制开始前加上下 ...
- Mac使用brew安装nginx,并解决端口80访问权限问题
1.安装 brew install nginx 2.修改配置文件 sudo vi /usr/local/etc/nginx/nginx.conf 修改默认的8080端口为80 修改日志文件地方 err ...
- mysql排序自段为字符串类型问题解决
677 000.000.000.000 2018-01-09 22:20:58 编辑 删除 锁定 199 666/777/888套餐标配 000.000.000.000 2018-01 ...
- trylock方法
synchronized 是不占用到手不罢休的,会一直试图占用下去. 与 synchronized 的钻牛角尖不一样,Lock接口还提供了一个trylock方法.trylock会在指定时间范围内试图占 ...
- 解决Jmeter跨线程组取参数值难题!(还没试)
来源 https://mp.weixin.qq.com/s/q7ArxwnX1sOfa9tfHouSBQ 如果你工作中已经在用jmeter做接口测试,或性能测试了,你可能会遇到一个麻烦. 那就是j ...
- Block pool ID needed, but service not yet registered with NN java.lang.Exception: trace 异常解决
以上为报错信息: 原因大概为:dd和nd关联的versionId不同导致, 解决方案,备份之前的current文件夹,让其自己生成新的.