python数组操作

leetcode_315_逆序对问题

本小妞迷上赌 提交于 2020-02-13 11:10:55
题目描述 本题来自于Leetcode的算法题库第315题,具体题目描述如下: 给定一个 nums 整数数组 ,按要求返回一个 counts 新数组 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。 给出实例: 输入: [5,2,6,1] 输出: [2,1,1,0] 解释: 5 的右侧有 2 个更小的元素 (2 和 1). 2 的右侧仅有 1 个更小的元素 (1). 6 的右侧有 1 个更小的元素 (1). 1 的右侧有 0 个更小的元素. 最容易想到的解题思路 这个题目看上去很容易读懂也很容易下手,但是在难度设置上是 hard ,其实最大的问题就是复杂度的问题,最基本的思路就是遍历输入的数组,比较每一个元素和其之后的元素使用计数器记录并添加到输出数组中去,这样的算法复杂度很显然是$O(n^2)$, 代码如下: 12345678910 class : def countSmaller(self, nums): result = [] for i in range(len(nums)): temp = 0 for j in range(i,len(nums)): if nums[i] > nums[j]: temp += 1 result.append(temp) return result

为什么很多编程语言中数组都从0开始编号

天涯浪子 提交于 2020-02-13 10:35:25
寻址方式的原因 从数组存储的内存模型上来看,“下标”最确切的定义应该是“ 偏移 (offset)”。 如果用 a 来表示数组的首地址,a[0]就是偏移为 0 的位置,也就是首地址。 a[k]就表示偏移 k 个 type_size 的位置,所以计算 a[k]的内存地址就是 a[k]_address = base_address + k * type_size 我们拿一个长度为 10 的 int 类型的数组 int[] a = new int[10]来举例。 计算机给数组 a[10],分配了一块连续内存空间 1000~1039,其中,内存块的首地址为 base_address = 1000。 计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。 当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址: a[i]_address = base_address + i * data_type_size //data_type_size 表示数组中每个元素的大小。 但是,如果数组从 1 开始计数,那我们计算数组元素 a[k]的内存地址就会变为 a[k]_address = base_address + (k-1)*type_size 从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

数据分析(一)

半腔热情 提交于 2020-02-11 06:29:59
学习python要有面向数组/多维数组的编程思维 numpy好的地方就在于可以进行数组层面的操作,不用循环去处理数组中的每一个元素,这叫做矢量化,以上用的函数基本都要在前面加上np. ndarray里面是同一种类型的数据 切片的赋值会影响到源数据 如果只是复制一份切片,需要用到copy() type(arr)是看arr的整个类型 arr.dtype是看arr中元素的数据类型 如何改变数据类型用astype 但是是产生一个新的数组,原数组类型不变 将元组列表等序列数组转换为ndarray用asarray 但是是创建了一个新的数组,原arr没有变 两种取值方式是等价的 以整数数组来取出对应数组 若传入多个整数数组,返回的是索引元组,注意是元组 本应该是一个3x3的矩阵才对,要想取得矩阵需要这样 还可以用np.ix_函数 用.T取得数组的转置 还可以通过transpose函数来转换轴来实现数组的转置 其中参数是变换后轴位置的元组,(1,0)表示,把原来的0轴和1轴对换 swapaxes函数是用来交换轴的,只能传入两个参数,意味着这个函数只能交换两个2轴 通用函数(ufunc):快速元素级数组函数 从字面上理解就是进行元素级别的函数,如sqrt、exp、maximum等 可以用来划分整数和小数的函数modf,返回的是两个数组 《利用python进行数据分析

c++之容器详解

十年热恋 提交于 2020-02-10 15:47:37
5. 类模板编程 有时候继承、包含并不能满足重用代码的需要,这一般在容器类里面体现的尤为突出。例如: 我们定义了一个容器类,Container, 这个Container类可以实现类似verctor一样的工作,能保存数据,能修改数据,并且 数据的类型不限制 ,但是 针对数据的操作都是一样 的。那么类模板编程就成了不二之选了。 1. 定义模板类 这里以栈作为参照对象,定义一个模板类,实现栈一样的功能。 原始代码 class Stack{ private : enum{MAX = 10}; //表示这个Stack容器最多只能装10个。 int top =0 ; //表示最顶上的索引位置 string items[MAX]; //定义一个数组,以便一会装10个元素 public: bool isempty(){ return top == 0; } bool isfull(){ return top == MAX; } //压栈 int push(string val){ if(isfull()){ return -1; } //没有满就可以往里面存 items[top++] = val; } //出栈 string pop(){ if (isempty()){ return ""; } //如果不是空 top 只是指向位置,而数组获取数据,索引从0开始,所以先-- return

什么是数组?

倾然丶 夕夏残阳落幕 提交于 2020-02-09 23:34:24
今天要介绍的主角就是- 数组 ,数组也是数据呈线性排列的一种数据结构。与前一节中的 链表 不同,在数组中,访问数据十分简单,而添加和删除数据比较耗工夫。这和 什么是数据结构 那篇文章中讲到的姓名按拼音顺序排列的电话簿类似。 数组 如上就是数组的概念图,Blue、Yellow、Red 作为数据存储在数组中,其中 a 是数组的名字,后面 [] 中的数字表示该数据是数组中的第几个数据,该数字也就是 数组下标,下标从 0 开始计数 ,比如 Red 就是数组 a 的第 2 个数据。 那么 为什么许多编程语言中的数组都从 0 开始编号的呢 ?先别急,可以先自己思考下,将会在文末进行讲解。 从图中可以看出来,数组的数据是按 顺序存储 在内存的连续空间内的。 由于数据是存储在连续空间内的,所以每个数据的内存地址(在内存上的位置)都可以通过数组下标算出,我们也就可以借此直接访问目标数据,也就是 随机访问 。 比如现在我们想要访问 Red,如果是链表的话,只能使用指针就只能从头开始查找,但在数组中,只需要指定 a[2],便能直接访问 Red。 但是,如果想在任意位置上添加或者删除数据,数组的操作就要比链表复杂多了。这里我们尝试将 Green 添加到第 2 个位置上。 首先,在数组的末尾确保需要增加的存储空间。 为了给新数据 Green 腾出位置,要把已有数据一个个移开,首先把 Red 往后移。 然后把

NumPy学习心得(二)

强颜欢笑 提交于 2020-02-09 09:10:53
基本运算 数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。 [python] >>> a= np.array([ 20 , 30 , 40 , 50 ]) >>> b= np.arange( 4 ) >>> b array([ 0 , 1 , 2 , 3 ]) >>> c= a-b >>> c array([ 20 , 29 , 38 , 47 ]) >>> b** 2 array([ 0 , 1 , 4 , 9 ]) >>> 10 *np.sin(a) array([ 9.12945251 ,- 9.88031624 , 7.4511316 , - 2.62374854 ]) >>> a< 35 array([ True , True , False , False ], dtype=bool) 与 其他 矩 阵语言不同, NumPy 中的乘法运算 符 * 按 元 素逐个 计算, 矩阵乘法可以使用 dot 函数或创建 矩阵对象实现 ( 后续章节会介绍) [python] >>> A= np.array([[ 1 , 1 ], ...[ 0 , 1 ]]) >>> B= np.array([[ 2 , 0 ], ...[ 3 , 4 ]]) >>> A*B # 逐个元素相乘 array([[ 2 , 0 ],    [ 0 , 4 ]]) >>> np.dot

《利用python进行数据分析》读书笔记之Numpy基础(二)

时光怂恿深爱的人放手 提交于 2020-02-08 20:07:12
NumPy ndarray:通用函数与面向数组的编程 通用函数 面向数组的编程 将条件逻辑作为数组操作 数学和统计方法 布尔值数组方法 排序 唯一值与其他逻辑集合 通用函数 通用函数,也称为ufunc,可以对ndarray中的元素进行逐个操作,分为一元通用函数和二元通用函数。 一元通用函数:接受一个数组并返回结果,如: arr = np . arange ( 10 ) print ( np . sqrt ( arr ) ) #[0. 1. 1.41421356 1.73205081 2. 2.23606798 #2.44948974 2.64575131 2.82842712 3. ] print ( np . exp ( arr ) ) #[1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01 #5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03 #2.98095799e+03 8.10308393e+03] 二元通用函数:接受两个数组并返回结果,如: arr1 = np . array ( [ 1 , 3 , 4 , 7 ] ) arr2 = np . array ( [ 2 , 1 , 5 , 3 ] ) print ( np .

LeetCode 题库练习 1

半世苍凉 提交于 2020-02-07 06:57:45
题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 分析题目 从一个整数数组中,找到和为特定值的两个数,需要计算每两个数的和,首先可以想到的一种方法是,直接对这个数组 arr 进行从前往后的查找,用两个索引,i , j 分别表示被加数和加数再这个数组中的索引: 固定被加数 arr[i],即 i 不变,加数 arr[j] 从被加数所在的索引后面一个元素开始进行遍历,即 j in range(i+1, len(arr)),若在遍历过程中这两个数的和已经等于 target 了,那么直接返回 i 和 j,即是所求 当 j 已经遍历到数组的最后一个索引,时,说明被加数 arr[j] 没有与之匹配的加数,变化被加数,将 i 索引向后移动一位,即 i += 1,重复步骤 1,直到找到符合条件的 arr[i] 和 arr[j] 最坏的情况是需要的被加数和加数在数组的末尾,因此程序的时间复杂度是 O(n) = n * log(n)。 根据上面的算法步骤,可以给出如下的代码

『NumPy』入门概述

无人久伴 提交于 2020-02-07 02:42:50
文章目录 1. ndarry对象 1.1 元素类型 1.2 创建数组 1.2.1 array()函数 1.2.2 empty()函数 1.2.3 zeros()函数 1.2.4 ones()函数 1.2.5 arange()函数 1.2.6 linspace()函数 1.2.7 logspace()函数 1.3 数组的属性 1.4 一维数组存取元素 1.4.1 切片存取 1.4.2 整数列表存取 1.4.3 整数数组存取 1.4.4 布尔存取 1.5 多维数组存取元素 1.5.1 存取视图 1.5.2 存取副本 1.5.3 多维数组作下标存取 1.6 结构数组 1.7 内存结构 2. ufunc函数 2.1 数学运算 2.2 比较运算 2.3 逻辑运算 2.4 any() & all() 2.5 位运算 2.6 自定义ufunc函数 2.6.1 frompyfunc函数 2.6.2 vectorize函数 2.7 广播 2.7.1 规则 2.7.2 示例 2.7.3 broadcast_arrays函数 2.8 ufunc的方法 2.8.1 reduce()方法 2.8.2 accumulate()方法 2.8.3 reduceat()方法 2.8.4 outer()方法 3. 庞大的函数库 3.1 随机数 3.1.1 rand()函数 3.1.2 randn()函数 3.1.3

Python--numpy库

我的梦境 提交于 2020-02-07 00:43:26
Python中用list保存一组值,可用来当做数组使用,由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。【1,2,3】则需要三个指针,三个整数对象。 这对于数值运算来说,比较浪费内存和CPU计算时间; array 模块, array对象和列表不同,和C语言的一维数组类似 但不支持多维,没有各种运算函数。 numpy 提供 ndarray(N-dimensinal array object)对象:ndarray 是存储单一数据类型的多维数组。 ndarray数组操作: 概述: N维数组对象ndarray 是用于存放同类型元素的多维数组。 ndarray 中的每个元素在内存中都有相同存储大小的区域。 ndarray 中的每个元素是数据类型对象的对象(成为dtype)。 与Python中的其他容器对象一样,可以通过对数组进行索引或切片。 可通过ndarray 的方法和属性来访问和修改ndarray的内容。 创建数组: array()函数 zeros()函数:指定长度的全0数组 ones()函数:指定长度的全1数组 identify(3):单位矩阵(对角为1,其他为0),3行3列 创建随机数组 1. 均匀分布 np.random.rand(10,10) 创建指定形状(示例为10行10列)的数组(范围在0至1之间) np.random.uniform(0,100)