1. 程式人生 > >多維陣列的行優先和列優先, 資料描述語言

多維陣列的行優先和列優先, 資料描述語言

多維陣列的行優先和列優先

這裡以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 time

test = TestMsg()
test.id=1
test.time=int(time.time())
test.string="asdftest"
print test
test_str = test.SerializeToString()
print test_str

test1 = 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初探