python中的np array函数_numpy中的np.ascontiguousarray()函数

"Return a contiguous array (ndim >= 1) in memory (C order)."

用途

ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。

C order vs Fortran order

C order 指的是行优先的顺序(Row-major Order),即内存中同行的元素存在一起,

Fortran Order则指的是列优先的顺序(Column-major Order),即内存中同列的元素存在一起。

Pascal, C,C++,Python都是行优先存储的,而Fortran,MatLab是列优先存储的。

Contiguous array

contiguous array指的是数组在内存中存放的地址也是连续的(注意内存地址实际是一维的)。

2维数组arr = np.arange(12).reshape(3,4)。数组结构如下

在内存里中实际存储如下:

arr是 C order 的,在内存是行优先的。如果想要向下移动一列,则需要跳过3个块(例如,从0到4只需要跳过1,2和3)。

如果经过转置,arr.T没有了C连续特性,因为内存中元素的地址不变,同一行中的相邻元素在内存中不是连续的:

这时,arr.T变成了Fortran order,因为相邻列中的元素在内存中是相邻存储的。

从性能上来说,获取内存中相邻的地址比不相邻的地址速度要快很多(从RAM读取一个数值的时候可以连着一起读一块地址中的数值,并且可以保存在Cache中),这意味着对连续数组的操作会快很多。

由于arr是C连续的,因此对其进行行操作比进行列操作速度要快。通常来说

np.sum(arr, axis=1) # 按行求和

会比

np.sum(arr, axis=0) # 按列求和

稍微快些。 同理,在arr.T上,列操作比行操作会快些。

使用 np.ascontiguousarray()

Numpy中,随机初始化的数组默认都是C连续的。

经过不规则的slice操作,则会改变连续性,可能会变成既不是C连续,也不是Fortran连续的。

可以通过数组的.flags属性,查看一个数组是C连续还是Fortran连续的

>>> import numpy as np

>>> arr = np.arange(12).reshape(3, 4)

>>> arr.flags

C_CONTIGUOUS : True

F_CONTIGUOUS : False

OWNDATA : False

WRITEABLE : True

ALIGNED : True

WRITEBACKIFCOPY : False

UPDATEIFCOPY : False

从输出可以看到数组arr是C连续的。 对arr进行按列的slice操作,不改变每行的值,则还是C连续的:

>>> arr

array([[ 0, 1, 2, 3],

[ 4, 5, 6, 7],

[ 8, 9, 10, 11]])

>>> arr1 = arr[:2, :]

>>> arr1

array([[ 0, 1, 2, 3],

[ 4, 5, 6, 7]])

>>> arr1.flags

C_CONTIGUOUS : True

F_CONTIGUOUS : False

OWNDATA : False

WRITEABLE : True

ALIGNED : True

WRITEBACKIFCOPY : False

UPDATEIFCOPY : False

如果进行在行上的slice,则会改变连续性,成为既不C连续,也不Fortran连续的:

>>> arr1 = arr[:, 1:3]

>>> arr1.flags

C_CONTIGUOUS : False

F_CONTIGUOUS : False

OWNDATA : False

WRITEABLE : True

ALIGNED : True

WRITEBACKIFCOPY : False

UPDATEIFCOPY : False

此时利用ascontiguousarray函数,可以将其变为连续的:

>>> arr2 = np.ascontiguousarray(arr1)

>>> arr2.flags

C_CONTIGUOUS : True

F_CONTIGUOUS : False

OWNDATA : True

WRITEABLE : True

ALIGNED : True

WRITEBACKIFCOPY : False

UPDATEIFCOPY : False

参考

本篇文章由一文多发平台ArtiPub自动发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV版本

#include <opencv2/opencv.hpp>using namespace cv;void main(){/*printf("\t当前使用的opencv版本为 OpenCV"CV_VERSION);getchar();*/std::cout << "\t当前使用的opencv版本为 OpenCV" << CV_VERSION << std::endl;system(&quo…

使用jstat的JVM统计信息

过去&#xff0c;我已经写过关于Oracle和/或OpenJDK Java开发工具包&#xff08;JDK&#xff09;随附的几个命令行工具的信息&#xff0c;但是我从来没有专门写过jstat工具 。 Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机&#xff08;JVM&#xff09;统计信息”…

每天一点点之 taro 框架开发 - taro路由及传参

1.路由 taro的路由是自带的&#xff0c;不需要我们额外配置&#xff0c;只需要我们在app.js下config中配置pages即可 class App extends Component {config {pages: [pages/test/test,pages/index/index],} } 2.taro通过api实现跳转&#xff0c;替换 官网地址&#xff1a;taro…

调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?

微信小程序开发的过程一定会遇到各种问题&#xff0c;最让人棘手的就是支付问题&#xff0c;因为没有支付做商城类似的小程序就没有办法完成最关键的一步。那么支付失败到底什么原因呢&#xff1f;一下子收集了几个错误类似&#xff0c;希望对你有帮助&#xff1a;No.1{err_cod…

Visual Stutio中win32控制台应用程序、win32项目、MFC项目的区别:

我的理解&#xff0c;我首先把这几个货分为两大类&#xff1b;第一类包括win32控制台应用程序&#xff0c;第二类就是剩下那俩货。而剩下那俩货又有一个包含关系&#xff0c;即win32项目包含mfc。&#xff08;我个人是这个区分的。&#xff09; 一、 区别: &#xff08;1&…

二分图匹配【模板】

传送门&#xff1a; #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define ll long long #define re register const int N1005; inline void read(int &a) {a0;int d1;char ch;while(chgetchar(),ch>9||ch<0)if(…

c++两个数组对比去掉重复的元素_30 数组案例

数组案例案例一&#xff1a;筛选指定数组元素要求&#xff1a;将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后&#xff0c;形成一个不包含0的新数组。var arr [2,0,6,1,77,0,52,0,25,7];var newArr [];for(var i0; i<arr.length; i){if(arr[i]!0){newArr[newArr.length]arr[i…

排序并记录排序前的索引(类似matlab sort函数)

这里用到vector比较方便。 #include<iostream> #include<vector> #include<algorithm> using namespace std; struct num_label { int num; int label; }; //自定义“大于” bool comp(const num_label &a, const num_label &b) { return a.n…

selenium实现登录百度(自动识别简单验证码)

需要做的工作 0、工程结构 1、代码&#xff1a; ①baidu_login.py 1 import re2 import os3 import sys4 import time5 import random6 from selenium import webdriver7 from PIL import Image, ImageEnhance8 import pytesseract9 from func import base642str, str2base6410…

为什么猫王不应该访问Java

最近&#xff0c;我参与了一个关于Java的Optional类型系统的漫长的Twitter讨论 &#xff0c;该系统区分可空类型和非可空类型以及Elvis运算符 &#xff0c;该运算符允许选择空值安全的成员。 后者被认为是简洁的null处理的杀手级功能&#xff0c;对此我强烈不同意。 我对此的看…

python a and b_python-尽管Numpy建议a.b,为什么a.dot(b)比a @ b更...

根据question的答案,也根据numpy的答案,与a.dot(b)相比,二维数组的矩阵乘法最好通过a b或numpy.matmul(a,b)完成.If both a and b are 2-D arrays, it is matrix multiplication, but usingmatmul or a b is preferred.我做了以下基准测试,发现相反的结果.问题&#xff1a;我的…

Mysql高可用集群-解决MMM单点故障

目录 一.理论概述组件介绍三.部署四.测试五.总结preface: MMM架构相比于MHA来说各方面都逊色不少,写这篇案例也算是整理下思路吧. 一.理论概述 MMM(Master-Master replication Manager for MySQL) 是一套支持双主日常管理的脚本程序,使用Perl语言开发,主要用来监控和管理MySQL双…

vector元素的读取

1通过下标&#xff1a; int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (int i 0; i < b.size() - 1; i) cout << b[i] << " "; 2通过迭代器 int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (vector<int>:…

vector 中的元素去重

#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { cout << "********************一维向量*************************" << endl; vector<int> a; for (int i 0; i < 6; i) …

tcp的3次握手4次挥手

转载于:https://www.cnblogs.com/georgexu/p/10909808.html

python 如何定义字典_python dict如何定义

1.字典的定义字典的格式&#xff1a;字典名 {key1:value1, key2:value2,...}字典是无序的&#xff0c;是可变的数据类型字典的key不能是可变的数据类型(列表 字典)字典的key是不能重复的&#xff0c;但value可以例&#xff1a;my_dict {"name": "小明", …

MS SQL JSON类型type

在MS SQL Server 2016&#xff0c;已经支持JSON处理。 执行下面代码&#xff0c;将获取ms sql server对象类型以及其说明: IF OBJECT_ID(tempdb.dbo.#json_type) IS NOT NULL DROP TABLE #json_typeCREATE TABLE #json_type ( [type] TINYINT,[data_type] NVARCHAR(30) ) IN…

Eigen(8)实例最小二乘法

用Eigen库解Axb线性方程&#xff0c;使用最小二乘法 #include <iostream>#include <Eigen/Dense>using namespace std;using namespace Eigen;int main(){//对方程AxbMatrixXf A MatrixXf::Random(3, 2);std::cout << "Here is the matrix A:\n"…

java 和javafx_JavaFX 2 XYCharts和Java 7功能

java 和javafx我最喜欢的JavaFX 2功能之一是它在javafx.scene.chart包中提供的标准图表。 该软件包提供了几种不同类型的现成图表。 除其中之一&#xff08; PieChart &#xff09;外&#xff0c;所有其他均为“ 2轴图”&#xff08; XYChart的特定实现&#xff09;。 在本文中…

python语句分为什么语句_在python中如何分句

在处理文本时&#xff0c;会遇到需要将文本以 句子 为单位进行切分(分句)的场景&#xff0c;而文本又可以分为 中文文本 和 英文文本 &#xff0c;处理的方法会略有不同。本文会介绍 Python 是如何处理 分句 的。分句的关键是找到合适的结束符号&#xff0c;比如&#xff1a;中…