精华内容
下载资源
问答
  • numpy在数据处理时的优势时显而易见的,谈到numpy,会经常听到关于视图和副本的说法,今天就来记录一下视图个副本的区别。 首先讲一下两者的定义: 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会...

     

     

    numpy在数据处理时的优势时显而易见的,谈到numpy,会经常听到关于视图和副本的说法,今天就来记录一下视图个副本的区别。

    首先讲一下两者的定义:

    副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。

    视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。

    理解这个定义其实可以参考python的深浅拷贝的概念,副本其实就是类似于深拷贝,是完完整整的脱离了原来的数据,内存地址独立出来,可以进行任意的修改和操作,对原始的数据不会产生影响,视图类似于浅拷贝(可能这个对比并不完美),通俗一点说就是多了一个指向原来数据地址的路径,还是要依附于原来的数据,任意的操作都有可能对原始数据产生影响,所以,再进行数据处理的时候,最好是先做副本的处理,这样 数据处理过程中有什么差错都可以保留原始数据的完整性。

    视图一般发生在:

    • 1、numpy 的切片操作返回原数据的视图。
    • 2、调用 ndarray 的 view() 函数产生一个视图。

    副本一般发生在:

    • Python 序列的切片操作,调用deepCopy()函数。
    • 调用 ndarray 的 copy() 函数产生一个副本。

    无复制

    简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。

     

    此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

    视图或浅拷贝

    ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数

    import numpy as np 
     
    # 最开始 a 是个 3X2 的数组
    a = np.arange(6).reshape(3,2)  
    print ('数组 a:')
    print (a)
    print ('创建 a 的视图:')
    b = a.view()  
    print (b)
    print ('两个数组的 id() 不同:')
    print ('a 的 id():')
    print (id(a))
    print ('b 的 id():' )
    print (id(b))
    # 修改 b 的形状,并不会修改 a
    b.shape =  2,3
    print ('b 的形状:')
    print (b)
    print ('a 的形状:')
    print (a)

    运行结果是:

    数组 a:
    [[0 1]
     [2 3]
     [4 5]]
    创建 a 的视图:
    [[0 1]
     [2 3]
     [4 5]]
    两个数组的 id() 不同:
    a 的 id():
    4314786992
    b 的 id():
    4315171296
    b 的形状:
    [[0 1 2]
     [3 4 5]]
    a 的形状:
    [[0 1]
     [2 3]
     [4 5]]

    使用切片创建视图修改数据会影响到原始数组:

    import numpy as np 
     
    arr = np.arange(12)
    print ('我们的数组:')
    print (arr)
    print ('创建切片:')
    a=arr[3:]
    b=arr[3:]
    a[1]=123
    b[2]=234
    print(arr)
    print(id(a),id(b),id(arr[3:]))

    运行结果如下:

    我们的数组:
    [ 0  1  2  3  4  5  6  7  8  9 10 11]
    创建切片:
    [  0   1   2   3 123 234   6   7   8   9  10  11]
    4545878416 4545878496 4545878576

    变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据中。但是我们观察 a,b 的 id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。

    副本或深拷贝

    ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。 

    import numpy as np 
     
    a = np.array([[10,10],  [2,3],  [4,5]])  
    print ('数组 a:')
    print (a)
    print ('创建 a 的深层副本:')
    b = a.copy()  
    print ('数组 b:')
    print (b)
    # b 与 a 不共享任何内容  
    print ('我们能够写入 b 来写入 a 吗?')
    print (b is a)
    print ('修改 b 的内容:')
    b[0,0]  =  100  
    print ('修改后的数组 b:')
    print (b)
    print ('a 保持不变:')
    print (a)

    运行结果如下:

    数组 a:
    [[10 10]
     [ 2  3]
     [ 4  5]]
    创建 a 的深层副本:
    数组 b:
    [[10 10]
     [ 2  3]
     [ 4  5]]
    我们能够写入 b 来写入 a 吗?
    False
    修改 b 的内容:
    修改后的数组 b:
    [[100  10]
     [  2   3]
     [  4   5]]
    a 保持不变:
    [[10 10]
     [ 2  3]
     [ 4  5]]

    ps:这里再强调一下赋值和浅拷贝的区别,赋值就是引用,赋值的两端的id是一样的,改变两个中的任意一个都会使另一个发生变化,浅拷贝的话,id是不一样的,只拷贝了第一层,深层的并没有拷贝。

     

     

    展开全文
  • 我看过了几个开源的项目 比如JForum和bbscs等等 他们的数据库的建立都是基于数据表的 都没有使用视图的方式 但是在书本上学的好象多表关联比较推荐视图的处理方式 我在项目中用的和看到的原有设计也都没有使用视图 ...
  • 创建视图的主要目的是为了方便查询数据,而不能提高查询效率,要提高效率只能通过其它的办法优化,比如创建索引之类的。 以下证明上面的说法: 按日查询出平均数据,数据量为58万条 select avg(ave_value) ave_value...

    创建视图的主要目的是为了方便查询数据,而不能提高查询效率,要提高效率只能通过其它的办法优化,比如创建索引之类的。

    以下证明上面的说法:

    按日查询出平均数据,数据量为58万条

    select avg(ave_value) ave_value,to_date((CONCAT(to_char(create_time,'yyyy-mm-dd'),' 00:00:00')),'yyyy-mm-dd hh24:mi:ss')create_time  from PDB_NWD_CPUM_D group by to_char(create_time,'yyyy-mm-dd');

    耗时:0.422秒

    下面创建一个视图跟上面语法的对应

    create view PDB_NWD_CPUM_D_DAY as select avg(ave_value) ave_value,to_date((CONCAT(to_char(create_time,'yyyy-mm-dd'),' 00:00:00')),'yyyy-mm-dd hh24:mi:ss')  create_time from PDB_NWD_CPUM_D group by to_char(create_time,'yyyy-mm-dd');

    视图创建完之后我们查询这个视图:

    select ave_value,create_time  from PDB_NWD_CPUM_D_DAY;

    耗时0.429秒

     

    多运行几遍发现查询效率并没提高。

     

    当然如果针对多张表做视图,将会体现出视图的好处--方便。

    展开全文
  • 同意NinGoo的说法!顺便问一下 yangtingkun版主,您所说的“如果物化视图和基表不在同一个数据库中,是无法建立ON COMMIT刷新模式的物化视图的”中“同一个数据库”是指在同一个实例中的两个用户还是分布式数据库中...

    同意NinGoo的说法!

    顺便问一下 yangtingkun版主,您所说的“如果物化视图和基表不在同一个数据库中,是无法建立ON COMMIT刷新模式的物化视图的”中“同一个数据库”是指在同一个实例中的两个用户还是分布式数据库中?

    分布式数据库中确实不能创建on commit模式的物化视图,不能就会报ora-12054错误,无法为实体化视图设置on commit 刷新属性。这个我是测试过的。

    但是我在同一个实例中创建两个用户间的on commit模式物化视图的时候,是报一个权限不够,但是能够成功创建on demand的物化视图。这里到底是权限不够还是在这种情况下就不能创建on commit物化视图呢?

    向版主请教,如果有些说法不对,请指出,非常感谢!

    下面是我的测试过程:

    hongsy@test>select count(*) from ttt;

    COUNT(*)

    ----------

    2

    hongsy@test>desc ttt;

    名称                                      是否为空? 类型

    ----------------------------------------- -------- ----------------------------

    ID                                        NOT NULL NUMBER

    VAL                                                NUMBER

    PADDING                                            VARCHAR2(100)

    hongsy@test>alter table ttt add constraint ttt_con primary key(id);

    表已更改。

    hongsy@test>create materialized view log on ttt with primary key;

    实体化视图日志已创建。

    hongsy@test>conn test1/test@report

    已连接。

    hongsy@test>create materialized view hhhh

    2  refresh fast on commit

    3  as select * from test.ttt;

    as select * from test.ttt

    *

    ERROR 位于第 3 行:

    ORA-01031: 权限不足

    hongsy@test>conn test/test@report

    已连接。

    hongsy@test>grant select on ttt to test1;

    授权成功。

    hongsy@test>conn test1/test@report

    已连接。

    hongsy@test>create materialized view hhhh

    2  refresh fast on commit

    3  as select * from test.ttt;

    as select * from test.ttt

    *

    ERROR 位于第 3 行:

    ORA-01031: 权限不足

    hongsy@test>create materialized view hhhh

    2  refresh fast on demand

    3  as select * from test.ttt;

    实体化视图已创建。

    hongsy@test>select * from v$version;

    BANNER

    ----------------------------------------------------------------

    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

    PL/SQL Release 9.2.0.1.0 - Production

    CORE        9.2.0.1.0        Production

    TNS for 32-bit Windows: Version 9.2.0.1.0 - Production

    NLSRTL Version 9.2.0.1.0 - Production

    展开全文
  • 视图模型更加类似一张表虚拟的表,视图包含一系列带有...对其中所引用的基础表来说,视图的作用类似于筛选,这是ThinkPHP手册上的说法 其实说白了,视图模型就是mysql多表查询而已,视图模型不支持多表更新,删除 ...

    视图模型更加类似一张表虚拟的表,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选,这是ThinkPHP手册上的说法

        其实说白了,视图模型就是mysql多表查询而已,视图模型不支持多表更新,删除


        而关联模型是多个表查询以后的结果组合,会多次查询mysql,(在执行完主表查询以后,会有个_after_select)之类的操作,然后组合结果集。在一些情况下,关联模型的查询还是比较不错的。

        以下是个人使用ThinkPHP的关联模型和视图模型的一些心得和比较

        一:性能方面

          视图模型,说白了就是关联查询,一次查询多表

          关联模型,每次查询一张表,多次查询,然后组合结果集(插入,更新,删除也是一样的。)  

          个人觉得视图模型性能会好一些(不一定全部都是,没有具体测试过)

        二:查询

          如果是查询的话,强烈建议使用视图模型来做,写法简单,容易理解和更改,而关联模型的定义方式太多,而且结果集的处理,调试,都不如视图模型要方便。

        三:插入,更新,删除

          视图模型不支持,关联模型支持,但是在插入,更新的时候,不能使用Model的create方法,还有自动完成,自动更新都失效了,我自己重写了一个create,给大家一些提示,可以自己按照需要更改。

       

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    /**
         * 重载create方法,不过滤字段,并且生成需要数据
         */
        function create($data ''$type '') {
            // 如果没有传值默认取POST数据
            if (empty($data)) {
                $data $_POST;
            elseif (is_object($data)) {
                $data = get_object_vars($data);
            }
            // 验证数据
            if (empty($data) || !is_array($data)) {
                $this->error = L('_DATA_TYPE_INVALID_');
                return false;
            }
            // 状态
            $type $type $type : (!empty($data[$this->getPk() ]) ? self::MODEL_UPDATE : self::MODEL_INSERT);
            // 数据自动验证
            if (!$this->autoValidation($data$type)) return false;
            // 表单令牌验证
            if (!$this->autoCheckToken($data)) {
                $this->error = L('_TOKEN_ERROR_');
                return false;
            }
            // 验证完成生成数据对象
            if ($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据
                $fields $this->getDbFields();
                foreach ($data as $key => $val) {
                    if (MAGIC_QUOTES_GPC && is_string($val)) {
                        $data[$key] = stripslashes($val);
                    }
                }
            }
            // 创建完成对数据进行自动处理
            $data=$this->autoOperation($data$type);
            $data=$this->createData($data);
            // 返回创建的数据以供其他调用
            return $data;
        }
     
        /**
         * 自动表单处理
         * @access public
         * @param array $data 创建数据
         * @param string $type 创建类型
         * @return mixed
         */
        private function autoOperation($data$type) {
            if (!empty($this->options['auto'])) {
                $_auto $this->options['auto'];
                unset($this->options['auto']);
            elseif (!empty($this->_auto)) {
                $_auto $this->_auto;
            }
            // 自动填充
            if (isset($_auto)) {
                foreach ($_auto as $auto) {
                    // 填充因子定义格式
                    // array('field','填充内容','填充条件','附加规则',[额外参数])
                    if (empty($auto[2])) $auto[2] = self::MODEL_INSERT; // 默认为新增的时候自动填充
                    if ($type == $auto[2] || $auto[2] == self::MODEL_BOTH) {
                        switch (trim($auto[3])) {
                            case 'function'//  使用函数进行填充 字段的值作为参数
                            case 'callback'// 使用回调方法
                                $args = isset($auto[4]) ? (array)$auto[4] : array();
                                if (isset($data[$auto[0]])) {
                                    array_unshift($args$data[$auto[0]]);
                                }
                                if ('function' == $auto[3]) {
                                    $data[$auto[0]] = call_user_func_array($auto[1], $args);
                                else {
                                    $data[$auto[0]] = call_user_func_array(array(&$this,
                                        $auto[1]
                                    ) , $args);
                                }
                                break;
                            case 'field'// 用其它字段的值进行填充
                                $data[$auto[0]] = $data[$auto[1]];
                                break;
                            case 'ignore'// 为空忽略
                                if ('' === $data[$auto[0]]) unset($data[$auto[0]]);
                                break;
     
                            case 'string':
                            default// 默认作为字符串填充
                                $data[$auto[0]] = $auto[1];
                            }
                            if (false === $data[$auto[0]]) unset($data[$auto[0]]);
                        }
                }
            }
            return $data;
        }
         
        /**
         * 生成关联模型需要的数据
         */
        function createData($data) {
            foreach ($data as $k => $v) {
                if (in_array($k$this->fields)) {
                    $data['Article'][$k] = $v;
                    unset($data[$k]);
                }
            }
            //删除多余字段
            unset($data['nid']);
            unset($data['create_date']);
            return $data;
        }


        就是直接复制的原来的create方法,但是去掉了字段过滤,然后自动验证,自动完成后,createData方法生成最后的数据,我觉得官方应该修改一下这一块,就更好了。

        

        其他:因为我定义的插入,更新,删除,查询等,都是在CommonAction公共类中,如果有特殊条件要使用关联查询,那么如果用关联视图的话,还要改成$model->relation(true)->select()的方式,个人觉得不是很方便,直接视图模型就不需要更改了。

        

        调试:视图模型会打印关联查询的全部sql语句,而关联模型,则只会打印第一条sql语句(因为他们是执行多条sql语句)










    本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1563416,如需转载请自行联系原作者
    展开全文
  • 一.视图 1. 首先,什么是视图,通俗讲 在实际数据库中,每一张表会有很多个字段,但是不同... 再说专业一点,视图是对SQL语句封装,这个说法在下面进行解释 2. 为什么说 视图是对SQL语句封装呢?这是因...
  • 按Django官方的说法,在Django开发过程中我们可以使用function-base-view(函数视图)和clase-base-view(类视图)实现http请求的相关处理。函数视图和类视图没有优劣的区分,各有好处。 函数视图处理http请求的时...
  • 【单选题】质量为5×10 -3 kg的振子做简谐振动,其振动方程为x=6×10 -2 cos(5...C 俯 、左视图宽对齐 D 可以自由排列【单选题】关于 PIL 库中的 Image 类功能的说法正确的是( )。【判断题】地面与隧道架空式悬挂都属...
  • 关于MVC框架说法

    2014-06-13 10:06:34
    软件体系结构通常被称为架构,一个架构模式描述软件系统里...视图负责交互,模型封装功能,控制器则充当视图与模型之间调度。设计模式则是用来解决一些常见具体问题。一个架构模式常常可以分解成很多个设计模式
  • ,s+=t,则s[2:8]结果是( )【单选题】三视图对应 投影 关系 叙述正确 是: A 主、俯视图长相等且对正 B 主、左视图高相等可不平齐 C 俯 、左视图宽对齐 D 可以自由排列【单选题】下列代码运行时不会产生错...
  • 【判断题】UIView继承自UIResponder类。(3.0分)【判断题】在Cocoa ...(3.0分)【判断题】UIWindow继承自UIView,是程序创建第一个视图控件。如果没有UIWindow,程序就没有任何UI界面。(3.0分)【判断题】使用导航控制...
  • 那么这种说法对于新手来说,可能会比较抽象,但是我们在之前的文章中,已经给大家详细介绍了关于mysql数据表视图的基础知识,需要了解下的朋友可以参考以下文章。本节内容重点是给大家讲解如何创建视图。下面我们...
  • 视图主要属性

    2021-03-02 17:13:49
    关于TreeView树视图控件,以下属性说法错误是 Nodes,节点集合 ImageList,获取节点图象ImageList控件名称 ImageIndex,默认节点图象索引 SelectedImageIndex,选中节点图象索引 Items,项集合 ...
  • 关于fragment重叠现象相信很多人遇到过,那到底是什么原因导致呢?本质上还是从“内存重启”这个说法讲起( Fragment系列之调用getActivity为null问题),前文已经解释了,这里就不重复概述了。造成原因1.重复...
  • 如果按照"静态文件"的说法, 用html + ajax来获取数据, 那么url就应该是前者, 然而我观察到的现在restful的网站明显不是这么干的. 比如github, Amazon, 他们在浏览器里的url就是 /products/{productid} 这样.
  • 转自: ... MVC全称是 Model View Controller,是一种非常非常流行的架构模式,相关MVC具体的,网上已经非常非常详尽了,不...其实Qt中的MVC并不叫MVC,而是叫“MVD”,Qt中没有Controller的说法,而是使用了另外一...
  • 第6章习题与参考答案 一单项选择题 1下列关于视图的说法正确的是B A视图与基本表一样也存储数据 B对视图的操作最终都转换为对基本表的操作 C视图的数据源只能是基本表 D所有视图都可以实现对数据的增删改查操作 2在...
  • 错题解析 1.一个关系数据库文件中的各条记录 (B) 。 原因解析: 各条记录的次序无关...3.下列关于视图的说法错误的是:B 原因解析: A正确,视图就类似于三视图一样是一张或者多张表映射出来的. B错误,视图不能
  • vc6.0 类在类视图消失解决方案

    千次阅读 2010-08-31 10:51:00
    网上解决方案:1、更改相关类头文件文件名2、关闭工程后,删除.ncb(说法1),删除.clw(说法2)关于第一种方法 已验证通过。注意:如果只是在头文件文件名最后添加一个空格(如file.h改为file .h)似乎不能...
  • 关于ViewState学习

    2019-09-27 10:00:34
    仍然在看“asp.net基础教程——C#版”。在看到第二章的小结的时候看到关于ViewState,有些不明所以,所以就到谷歌上搜索了一些文章。以下是个人整理的关于...在msdn中关于ViewState的说法视图状态是 We...
  • 关于枚举

    2019-07-27 17:48:36
    偶然看到微信大佬写的文章关于阿里不允许返回值里使用枚举的说法,大致如下 阿里开发手册: 作者(孤尽)的解释 我印象里公司的项目里有的方法应该是返回值里用到了枚举类的,比如 视图类 CmsCooperatorVO 包含了...
  • 5.关于struts项目中类与MVC模式对应关系,说法错误是 © A.Jsp文件实现视图View功能 B.ActionServlet这一个类是整个struts项目控制器 C.ActionForm、Action都属于Model部分 D.一个struts项目只能有一个...
  • 食品生物化学知到答案章节... 葛兰素事件后,遣散了大部分医院推广代表,医院推广陷于【单选题】下面关于帮助菜单说法错误是 A. 帮助菜单可以对3dsMax2009提供软件激活选项 B. 可以查看当前3dsMax版本信息 C. ...
  • 在了解mvc的时候,控制器显示视图时需要用include包含html视图文件,要是按上面的说法,html直接可以在php标签被解析,这很显然是不合理。 最后解决问题还是靠的php manual。果然还是手册靠谱,以后一定要养成遇到...
  • React和Vue都有关于生命周期概念,它表示在创建每个组件实例前都要有一个初始化过程。如设置数据监听、编译模板、挂载实例到视图、在数据变化时更新视图等。一.React&Vue生命周期A.Vue生命周期Vue生命周期是...
  • 项目管理培训,其中关于需求的一些言论记录下。昨天在群里讨论到了需求管理,觉得有些信息可以分享下,于是先记录些。...可能的说法1:用户有了这个功能以后,会更方便的查看他所有的任务2、某同类软
  • 下列哪些说法符合《阿里巴巴Java开发手册》:答案在文末 A. 对于“明确停止使用代码和配置”,如方法、变量、类、...多选 关于数据库命名规则,下列哪些说法符合《阿里巴巴Java开发手册》:答案在文末 A. 数据库库

空空如也

空空如也

1 2 3 4 5 6
收藏数 104
精华内容 41
关键字:

关于视图的说法