多维数组的行优先和列优先, 数据描述语言
多维数组的行优先和列优先
这里以numpy为工具,介绍一下多维数组的行优先和列优先的概念。
首先我们生成一个3x4的数组:
arr = np.arange(12).reshape(3,4)
它的形状是这样的:
如果我们按照C语言的方式存储它,也就是行优先存储的话,那么在内存中,它的形状是这样的:
这种存储方式又被称作C contiguous array。
另一派存储方式,也就是列优先存储,它的代表是Fortran语言。上面的数组在内存中的形状就是这样的了:
这种存储方式又被称作Fortran contiguous array。
numpy对这两种方式都支持,而且还巧妙的利用了两者之间的差异,对运算进行了简化。
arr2 = arr.T
比如上述转置操作,你以为numpy真的做了转置运算吗?其实不然。
>>>arr.flags.f_contiguous
False
>>>arr2.flags.f_contiguous
True
看到没,这里仅仅设置了一个标志而已。
C和Fortran的这种差异,实际上是上世纪60年代,两大IT巨头AT&T和IBM之间战争的结果,并深远的影响了后来的软件。比如在通用计算领域,主要采用C格式,而数值计算领域,则多采用Fortran格式。
典型的例子是Matlab。它最早是作为一些Fortran数学库的封装而存在的,因此很自然的采用了Fortran格式。OpenGL、OpenVX之类的接口,实际上也沿袭了这种路径依赖。
Fortran作为最早的高级语言(1957年),至今仍有很强的生命力,这主要归功于:
1.对数组、复数等数值计算的原生支持。这些语法糖,对于非程序员的科技人员很友好。
2.没有指针等复杂特性。这一点既降低了上手的门槛,又对于编译器优化(尤其是现在比较流行的并行计算优化)很有好处。普通科技人员即使没有经过特殊的程序训练,也可以写出非常高效的程序。
数据描述语言
JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。
其官网为:
http://json.org/
官网上列出了各种语言的JSON解析库。其中C语言的解析库中以json-c最为流行,其官网为:
https://github.com/json-c/json-c
和XML Path类似,JSON也定义了自己的JSON Path。参见:
http://goessner.net/articles/JsonPath/
参考:
https://addons.mozilla.org/zh-CN/firefox/addon/jsonview/
jsonview是一个用于检验JSON格式是否合法的Firefox插件。
http://www.bejson.com/
一个在线验证JSON语法的库。
https://docs.python.org/2/library/json.html
python自带的json包的文档
https://mp.weixin.qq.com/s/qk8hlcE3oxa-4a-G4sxGVg
为什么说JSON不适合做配置语言?
Jackson
Jackson是常用的Java语言的JSON库。
Maven安装:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.6.4</version>
</dependency>
Jackson提供了三种处理方法:
流式API:(也称为"增量分析/生成")读取和写入 JSON 内容作为离散事件。类似于XML SAX。
com.fasterxml.jackson.JsonParser读,com.fasterxml.jackson.JsonGenerator写。
树模型:提供一个JSON文档可变内存树的表示形式。类似于XML DOM。
com.fasterxml.jackson.databind.ObjectMapper生成树;树组成JsonNode节点集。
数据绑定:JSON和POJO相互转换,基于属性访问器规约或注解。
Jackson不支持JSON Path,可以使用以下项目:
https://github.com/jayway/JsonPath
这个项目的后端可以选择Jackson或Gson。
BSON
Binary JSON是在JSON的基础上,添加了索引及数据类型的一种二进制格式。相比JSON,它牺牲了可阅读性,得到了可遍历性和高效性。
BSON最早由MongoDB项目提出并使用,它的官网为:
http://bsonspec.org/
从中可以看出大多数语言的BSON解析库,都是MongoDB项目提供的。
YAML
YAML(Yet Another Markup Language)是JSON的超集。它没有JSON那么流行,主要被用于科学计算领域,比如OpenCV项目。它的官网为:
http://yaml.org/
这个网站很有特色,它本身就是一个YAML文件。
Protocol Buffers
Protocol Buffers是Google公司开发的一种数据描述语言。它的官网为:
https://github.com/google/protobuf
文档:
https://developers.google.com/protocol-buffers/
Tutorials:
https://developers.google.com/protocol-buffers/docs/tutorials
安装:
sudo apt install protobuf-compiler python-protobuf
这是一种注重效率,而可阅读性几乎为零的二进制格式。其效率超过BSON,但除非有相关格式文件,否则完全无法阅读。而BSON作为JSON的扩展,只有扩展的那部分不可读,其余部分仍保留JSON的可读性。
格式文件是Protocol Buffers中的重要概念,也是和JSON等格式在使用思路上最大的区别。
JSON采用的是,不同的语言提供不同的库来解析的方式。
而Protocol Buffers使用同一个格式文件,为不同语言生成相应的代码。这和CORBA的做法很类似。
与Protocol Buffers类似的方案,还有Facebook提出的Thrift、ZeroC提出的Slice和Hadoop Avro。
简易示例
test.proto:
message TestMsg
{required int32 id=1;required int32 time=2;optional string note=3;
}
protoc --python_out=./python/ test.proto
test.py:
import google.protobuf
from test_pb2 import TestMsg
import timetest = TestMsg()
test.id=1
test.time=int(time.time())
test.string="asdftest"
print test
test_str = test.SerializeToString()
print test_strtest1 = TestMsg()
test1.ParseFromString(test_str)
print test1
示例代码下载:
https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/protobuf
参考:
http://www.cnblogs.com/o87481299/p/4199892.html
python google protobuf使用
https://mp.weixin.qq.com/s/D1bjGRCFH6Ag9_xIfQ34SA
Google Protocol Buffers浅析
proto3
Protocol Buffers本身也有若干版本,且互不兼容。目前用的比较多的是proto2和proto3。
值得注意的是,proto3生成的python文件,仍然叫xxxx_pb2.py。
proto3最大的改进在于支持如下形式的proto文件的嵌套:
import "tensorflow/core/framework/node_def.proto";
参考:
http://www.cnblogs.com/ghj1976/p/4565846.html
proto3笔记
https://blog.csdn.net/menghaocheng/article/details/80176763
Python3-如何使用protobuf 3
HDF5
HDF是用于存储和分发科学数据的一种自我描述、多对象文件格式。HDF是由美国国家超级计算应用中心(NCSA)创建的,以满足不同群体的科学家在不同工程项目领域之需要。
官网:
https://support.hdfgroup.org/HDF5/
它的python接口:
http://www.h5py.org/
HDF5 for Python
参考:
https://www.phodal.com/blog/try-hdf5-in-mac-os-with-shell/
HDF5小试——高大上的多对象文件格式
PMML
PMML(Predictive Model Markup Language) 是一个开放的工业标准,它以XML为载体将上述数据挖掘任务标准化,可以把某一产品所创建的数据挖掘方案应用于任何其它遵从PMML标准的产品或平台中,而不需考虑分析和预测过程中的具体实现细节。使得模型的部署摆脱了模型开发和产品整合的束缚,为商业智能产品、数据仓库和云计算中的数据挖掘模型的应用环境开拓了新的篇章。
官网:
http://dmg.org/
参考:
https://www.ibm.com/developerworks/cn/xml/x-1107xuj/
PMML标准介绍及其在数据挖掘任务中的应用
FlatBuffers
FlatBuffers是Google为嵌入式平台打造的二进制格式,执行效率优于Protocol Buffers。但它的出名,却是由于Facebook最早在其Android App上使用。因此,有的文章也将之称为是Facebook发明的,但其实这是不正确的。
官网:
https://google.github.io/flatbuffers/
参考:
http://www.cnblogs.com/wingyip/p/5185593.html
FlatBuffers初探
多维数组的行优先和列优先, 数据描述语言相关推荐
- 【C++】二维数组的行指针和列指针
在C++中,数组与指针有密切的关系.任何通过数组和下标实现的表达式可等价地通过指针和偏移量实现.下面首先介绍一维数组与指针的关系,之后介绍二维数组的行指针和列指针. 1.一维数组和指针 定义一个长度为 ...
- C语言 二维数组行数和列数计算 - C语言零基础入门教程
目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...
- java数组是行优先还是列优先的语言_详解C语言数组中是以列优先吗
如果我们按照C语言的方式存储它,也就是行优先存储的话,那么在内存中,它的形状是这样的: 这种存储方式又被称作C contiguous array. C语言数组结构列优先顺序存储的实现 (GCC编译). ...
- Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列). public class Test { public static void main(String[] arg ...
- java二维数组从键盘更改_互换二维数组的行列。要求数组的行数、列数以及各元素均从键盘输入;输出互换前数组内容和互换后数组内容。(要求循环输入进行测试)Java...
1. 互换二维数组的行列.要求数组的行数.列数以及各元素均从键盘输入:输出互换前数组内容和互换后数组内容.(要求循环输入进行测试) package com.mingrisoft; import jav ...
- 行优先和列优先存储高维数组
行优先:就是数组元素按照先存储每一行的方式进行存储 列优先:就是数组元素按照先存储每一列的方式进行存储 假设A[n][m] 从0开始 (0---n-1)(0---m-1) 行优先:基地址+((行数)* ...
- Eigen入门之密集矩阵 10 - 矩阵的行优先及列优先存储
简介 本篇介绍Eigen中矩阵及二维数组的系数存储顺序–行优先及列优先,已经如何指定优先顺序. 行优先(row-majoe). 列优先(column-majoe) 矩阵的系数条目组成了一个二维的结构, ...
- C语言关系 是行还是列,C语言行优先和列优先的问题深入分析
C语言行优先和列优先的问题深入分析 摘要 本文主要探讨的是"行优先"原则和"列优先"原则的问题. 1. 背景 首先了解"行优先"和" ...
- 矩阵基础 (1). 行优先和列优先的问题
原 矩阵基础 (1). 行优先和列优先的问题 2016年08月18日 18:37:00 林微 阅读数:7351 </div><div class="operating&qu ...
最新文章
- Oracle总结第二篇【视图、索引、事务、用户权限、批量操作】
- mongodb安装失败与解决方法(附安装教程)
- Callable的简单使用
- 配置 html-webpack-plugin 生成预览页面||配置自动打包相关的参数
- 计算机供用户使用的内存区域,操作系统期末考试试卷三)
- html5嵌套css语言,HTML5和CSS3
- 解剖几个有点难度的C笔试题
- 网络爬虫中Jsoup请求url
- 1.4Hadoop伪分布式安装
- 第一节 Java语言发展史
- Python scipy拟合分布
- Spring : @EnableConfigurationProperties注解
- 论 BUG调试与(程序猿)初学者
- transaction already active
- 软工导论测试代码(归档):设备管理系统
- 前缀无歧义编码(PFC)
- 高斯过程回归,得到预测标签和不确定度度
- 兔子生兔子java_用Java编程计算兔子生兔子的问题
- 愿天下有情人都是失散多年的兄妹(bfs)
- 十大跑步运动耳机品牌有哪些,质量比较好的运动耳机品牌推荐
热门文章
- 删除WSS卸载后遗留的数据库
- JavaScript简介-1
- vue js前端根据所需参数生成二维码并下载
- (二)面试前的准备【要知己知彼,不打无准备之仗】
- cmder上传文件到服务器,wget 结合everything上传文件到服务器端(以及更改ip地址)...
- JQuery中的.attr()与.removeAttr()
- Vue2.0+vuex+H5实现音乐播放及歌曲切换功能的方法及原理解释
- Linux shell 操作命令 mkdir
- asp.net webapi 自定义身份验证
- 即时通讯 IM 开发指南 1:如何进行技术选型