当前位置: 首页 > 面试题库 >

使用高级索引进行赋值是否会复制数组数据?

杨海
2023-03-14
问题内容

我正在慢慢尝试理解numpy中views和copys之间的区别,以及可变与不可变类型之间的区别。

如果我使用“高级索引”访问数组的一部分,则应该返回一个副本。这似乎是真的:

In [1]: import numpy as np
In [2]: a = np.zeros((3,3))
In [3]: b = np.array(np.identity(3), dtype=bool)

In [4]: c = a[b]

In [5]: c[:] = 9

In [6]: a
Out[6]: 
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

由于c仅是副本,因此它不会共享数据,更改它也不会突变a。但是,这让我感到困惑:

In [7]: a[b] = 1

In [8]: a
Out[8]: 
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

因此,看来,即使我使用高级索引,分配也仍然会将左侧的内容视为视图。显然a,第2行与a第6行是相同的对象/数据,因为变异对其c没有影响。

所以我的问题是:a第8行中的对象/数据是否与以前相同(当然不包括对角线),还是副本?换句话说,a的数据是否已复制到新的a,或数据已被适当地突变?

例如,它是否像:

x = [1,2,3]
x += [4]

或类似:

y = (1,2,3)
y += (4,)

我不知道如何检查,因为无论哪种情况,a.flags.owndata都是True。如果我以一种混乱的方式考虑这个问题,请随意阐述或回答其他问题。


问题答案:

当您执行时c = a[b]a.__get_item__会以b将其作为唯一参数进行调用,并将返回的所有内容分配给c

当您执行时a[b] = ca.__setitem__使用bc作为参数调用,并且返回的所有内容都会被静默丢弃。

因此,尽管具有相同的a[b]语法,但是两个表达式在做的事情都不同。您可以子类化ndarray,重载这两个函数,并使它们的行为不同。在numpy中,默认情况下,前者返回一个副本(如果b是数组),但后者会a在适当位置进行修改。



 类似资料:
  • 问题内容: 如果我有以下代码: 请问或会首先评估? 问题答案: 首先评估索引。请参阅JLS第15.26.1节,尤其是: 15.26.1。 简单赋值运算符= … 如果左侧操作数是数组访问表达式(第15.13节),可能包含在一对或多对括号中,则: 1. 首先,评估左侧操作数数组访问表达式的数组引用子表达式。如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;(左操作数数组访问表达式的)索引子表达

  • 问题内容: 我有两个数组:墙和邻居。 我有一个枚举: 现在,我希望能够按其方向访问墙壁或邻居,因此不必绕过一堆魔术索引。 但是,当我阅读Enum.ordinal()的文档时,它说程序员几乎不会使用此方法,这使我认为不应以这种方式使用它。 我正在考虑做类似的事情: 甚至: 我应该恢复对索引值设置为NORTH,SOUTH,EAST,WEST的静态常量还是使用Enum的序数方法? 问题答案: 在切线问题

  • 我使用以下代码创建了一个数据表:- 主要的php-它包含调用数据表的脚本和从sql数据库获取数据的php脚本 和dtServerSideBasicScript。php-它是从sql server获取数据的脚本:- 现在,我必须应用数据表上方的Advanced filter部分,它可以是由以下字段组成的表单-姓名输入、年龄范围输入和性别选择输入字段。提交此表格时,相关搜索结果应显示在数据表中。

  • 问题内容: 如果排序列上有索引,排序是否使用mysql索引?索引还用于其他什么用途? 它对列的组合索引和单独索引有什么区别? 问题答案: 是的,当按排序列排序时,MySQL使用索引对信息进行排序。 另外,如果在添加到 SELECT 子句的所有列中都有索引,则MySQL不会从表本身加载数据,而是从索引加载数据(更快)。 合并和单独的索引之间的区别是,MySQL不能使用超过 一个 每次查询索引,因此,

  • 我是Java新手,最近我一直想知道巨大但部分为空的数组的内存消耗,就像下面的例子: > < li >我需要未知大小的数组-它可以是300k的值,也可以是300m的值,但要记住,它最好只保存50个值, < li> 我正在初始化大小为 用户每次使用给定的生成方法时都会生成一些必须存储在数组中的值 使用过大的数组有什么禁忌症吗?在性能方面,数组的大小有何重要,例如,当仅使用该阵列的 0,1% 与 100

  • 我正在尝试使用多级索引对数据帧进行子集。例如: 如您所见,df2包含带有state和office_id多级索引。对于df2,我想通过使用multindex find来对dataframe进行子集: 在历史上,我会将索引放在dataframe和列的子集中,但这样做效率不高。 谁能给我指出正确的方向吗?谢谢你!